es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminando valores atípicos a 3 desviaciones estándar de la media de una función monoexponencial en R.

Tengo un gran conjunto de datos que analiza el consumo de oxígeno de sujetos que hacen ejercicio a lo largo del tiempo (x = Tiempo, y = VO2). Estos datos se ajustan a una función monoexponencial.

Aquí hay un breve ejemplo de un marco de datos de muestra:

”’

VO2 <- c(11.71,9.84,17.96,18.87,14.58,13.38,5.89,20.28,20.03,31.17,22.07,30.29,29.08,32.89,29.01,29.21,32.42,25.47,30.51,37.86,23.48,40.27,36.25,19.34,36.53,35.19,22.45,30.23,3,19.48,25.35,22.74)
Tiempo <- c(0,2,27,29,31,33,39,77,80,94,99,131,133,134,135,149,167,170,177,178,183,184,192,222,239,241,244,245,250,251,255,256)
DF <- data.frame(VO2,Tiempo)

'''
Representación visual de los datos - * ten en cuenta que este conjunto de datos es mucho más pequeño (y por lo tanto puede no ajustarse tan bien a una función) que el conjunto de datos completo.

Soy algo nuevo en R y no soy un experto en matemáticas. Agradecería su ayuda con los dos objetivos de este conjunto de datos.
Según las convenciones típicas del laboratorio en el que trabajo, estos datos deben ajustarse a una función monoexponencial.

  1. Me encantaría obtener una idea de cómo ajustar los datos a una función como esta. Tenga en cuenta que tengo muchos conjuntos de datos similares (para diferentes sujetos) y necesito ajustar una función monoexponencial a cada uno de ellos. Sería mejor si el ajuste se pudiera aplicar de forma genérica en mis conjuntos de datos.
  2. Basándome en esta función monoexponencial, me gustaría identificar y eliminar cualquier punto atípico. Aquí definiré un punto atípico como cualquier punto >3 desviaciones estándar de la media de la función monoexponencial.

Hasta ahora, tengo este código (sin éxito) para ajustar una función a los datos anteriores. No solo no se ajusta bien, sino que tampoco puedo crear una función suave.

'''

fit <- lm(VO2~poly(Tiempo,2,raw=TRUE))
xx <- seq(1,250, length=32)
plot(Tiempo,VO2,pch=19,ylim=c(0,50))+
lines(xx, predict(fit, data.frame(DF=xx)), col="red")

'''

Gracias a todas las personas que han comentado y proporcionado sus valiosos comentarios. A medida que sigo aprendiendo e investigando, agregaré a esta publicación intentos exitosos/menos exitosos del código para este proceso. Gracias por su conocimiento, ayuda y comprensión.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para ajustar los datos a una función monoexponencial, podemos utilizar la función nls() en R. Aquí tienes un ejemplo de código:

    # Define la función monoexponencial
    monoexp <- function(x, A, k) {
      A * exp(-k * x)
    }
    
    # Ajusta los datos a la función monoexponencial usando nls()
    fit <- nls(VO2 ~ monoexp(Time, A, k), start = list(A = 35, k = 0.005))
    
    # Grafica los datos y la función
    plot(DF$Time, DF$VO2, pch = 19, ylim = c(0, 50))
    xx <- seq(1, 250, length = 100)
    lines(xx, predict(fit, newdata = list(Time = xx)), col = "red")
    

    En este código, definimos una función monoexp() que representa la función monoexponencial, con dos parámetros A y k. Luego utilizamos la función nls() para ajustar los datos a esta función, empezando con una estimación inicial de A = 35 y k = 0.005. La función nls() ajustará estos parámetros para encontrar el mejor ajuste a los datos.

    Para identificar y eliminar valores atípicos, podemos calcular los valores predichos de la función monoexponencial para cada punto de tiempo en los datos, y luego encontrar cualquier valor que esté más de 3 desviaciones estándar lejos de la media de estos valores predichos. Aquí tienes un ejemplo de código:

    # Obtén los valores predichos para cada punto de tiempo
    pred <- predict(fit, newdata = DF)
    
    # Calcula la media y desviación estándar de los valores predichos
    mean_pred <- mean(pred)
    sd_pred <- sd(pred)
    
    # Identifica y elimina cualquier valor que esté más de 3 desviaciones estándar lejos de la media
    outliers <- which(abs(pred - mean_pred) > 3 * sd_pred)
    DF_clean <- DF[-outliers, ]
    

    En este código, primero utilizamos la función predict() para obtener los valores predichos de la función monoexponencial para cada punto de tiempo en los datos. Luego calculamos la media y la desviación estándar de estos valores predichos. Finalmente, utilizamos la función which() para identificar cualquier valor que esté más de 3 desviaciones estándar lejos de la media, y eliminamos esos valores del marco de datos utilizando la indexación (DF[-outliers, ]).

    Espero que esto te ayude. Avísame si tienes alguna pregunta adicional.

Comments are closed.