total - numeros aleatorios en r studio
¿Cómo ajustar un modelo de efectos aleatorios con el Sujeto como aleatorio en R? (3)
Datos dados de la siguiente forma
myDat = structure(list(Score = c(1.84, 2.24, 3.8, 2.3, 3.8, 4.55, 1.13,
2.49, 3.74, 2.84, 3.3, 4.82, 1.74, 2.89, 3.39, 2.08, 3.99, 4.07,
1.93, 2.39, 3.63, 2.55, 3.09, 4.76), Subject = c(1L, 1L, 1L,
2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L,
7L, 7L, 8L, 8L, 8L), Condition = c(0L, 0L, 0L, 1L, 1L, 1L, 0L,
0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L,
1L), Time = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L,
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L)), .Names = c("Score",
"Subject", "Condition", "Time"), class = "data.frame", row.names = c(NA,
-24L))
Me gustaría modelar la puntuación en función del sujeto, la condición y el tiempo. El puntaje de cada sujeto (humano) se midió tres veces, indicado por la variable Tiempo, por lo que tengo medidas repetidas.
¿Cómo puedo construir en R un modelo de efectos aleatorios con efectos de asunto ajustados como aleatorios?
ADENDO : Se ha preguntado cómo generé estos datos. Lo adivinaste, los datos son falsos ya que el día es largo. La puntuación es tiempo más ruido aleatorio y estar en la condición 1 agrega un punto a la puntuación. Es instructivo como una configuración típica de Psych. Usted tiene una tarea en la que el puntaje de la gente mejora con la práctica (tiempo) y un medicamento (condición == 1) que mejora el puntaje.
Aquí hay algunos datos más realistas para los propósitos de esta discusión. Ahora los participantes simulados tienen un nivel de "habilidad" al azar que se agrega a sus puntajes. Además, los factores ahora son cadenas.
myDat = structure(list(Score = c(1.62, 2.18, 2.3, 3.46, 3.85, 4.7, 1.41,
2.21, 3.32, 2.73, 3.34, 3.27, 2.14, 2.73, 2.74, 3.39, 3.59, 4.01,
1.81, 1.83, 3.22, 3.64, 3.51, 4.26), Subject = structure(c(1L,
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L,
6L, 7L, 7L, 7L, 8L, 8L, 8L), .Label = c("A", "B", "C", "D", "E",
"F", "G", "H"), class = "factor"), Condition = structure(c(1L,
1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L,
2L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("No", "Yes"), class = "factor"),
Time = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L,
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("1PM",
"2PM", "3PM"), class = "factor")), .Names = c("Score", "Subject",
"Condition", "Time"), class = "data.frame", row.names = c(NA,
-24L))
Míralo:
library(ggplot2)
qplot(Time, Score, data = myDat, geom = "line", group = Subject, colour = factor(Condition))
usando la biblioteca nlme ...
Respondiendo a su pregunta establecida, puede crear un modelo de efecto mixto intecept al azar usando el siguiente código:
> library(nlme)
> m1 <- lme(Score ~ Condition + Time + Condition*Time,
+ data = myDat, random = ~ 1 | Subject)
> summary(m1)
Linear mixed-effects model fit by REML
Data: myDat
AIC BIC logLik
31.69207 37.66646 -9.846036
Random effects:
Formula: ~1 | Subject
(Intercept) Residual
StdDev: 5.214638e-06 0.3151035
Fixed effects: Score ~ Condition + Time + Condition * Time
Value Std.Error DF t-value p-value
(Intercept) 0.6208333 0.2406643 14 2.579666 0.0218
Condition 0.7841667 0.3403507 6 2.303996 0.0608
Time 0.9900000 0.1114059 14 8.886423 0.0000
Condition:Time 0.0637500 0.1575517 14 0.404629 0.6919
Correlation:
(Intr) Condtn Time
Condition -0.707
Time -0.926 0.655
Condition:Time 0.655 -0.926 -0.707
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-1.5748794 -0.6704147 0.2069426 0.7467785 1.5153752
Number of Observations: 24
Number of Groups: 8
La varianza de intercepción es básicamente 0, lo que indica que no hay efecto sujeto, por lo que este modelo no captura bien la relación entre tiempo. Un modelo de intercepción aleatorio rara vez es el tipo de modelo que desea para un diseño de medidas repetidas. Un modelo de intercepción aleatorio supone que las correlaciones entre todos los puntos de tiempo son iguales. es decir, la correlación entre el tiempo 1 y el tiempo 2 es la misma que entre el tiempo 1 y el tiempo 3. En circunstancias normales (tal vez no las que generan los datos falsos) esperaríamos que el último fuera menor que el anterior. Una estructura autoregresiva suele ser una mejor forma de avanzar.
> m2<-gls(Score ~ Condition + Time + Condition*Time,
+ data = myDat, correlation = corAR1(form = ~ Time | Subject))
> summary(m2)
Generalized least squares fit by REML
Model: Score ~ Condition + Time + Condition * Time
Data: myDat
AIC BIC logLik
25.45446 31.42886 -6.727232
Correlation Structure: AR(1)
Formula: ~Time | Subject
Parameter estimate(s):
Phi
-0.5957973
Coefficients:
Value Std.Error t-value p-value
(Intercept) 0.6045402 0.1762743 3.429543 0.0027
Condition 0.8058448 0.2492895 3.232566 0.0042
Time 0.9900000 0.0845312 11.711652 0.0000
Condition:Time 0.0637500 0.1195452 0.533271 0.5997
Correlation:
(Intr) Condtn Time
Condition -0.707
Time -0.959 0.678
Condition:Time 0.678 -0.959 -0.707
Standardized residuals:
Min Q1 Med Q3 Max
-1.6850557 -0.6730898 0.2373639 0.8269703 1.5858942
Residual standard error: 0.2976964
Degrees of freedom: 24 total; 20 residual
Sus datos muestran una correlación de punto de tiempo de -.596, lo cual parece extraño. normalmente debería haber, como mínimo, una correlación positiva entre los puntos temporales. ¿Cómo se generó esta información?
apéndice:
Con sus nuevos datos sabemos que el proceso de generación de datos es equivalente a un modelo de intercepción aleatorio (aunque no es el más realista para un estudio longitudinal. La visualización muestra que el efecto del tiempo parece ser bastante lineal, por lo que deberíamos sentirnos cómodos) tratándolo como una variable numérica.
> library(nlme)
> m1 <- lme(Score ~ Condition + as.numeric(Time) + Condition*as.numeric(Time),
+ data = myDat, random = ~ 1 | Subject)
> summary(m1)
Linear mixed-effects model fit by REML
Data: myDat
AIC BIC logLik
38.15055 44.12494 -13.07527
Random effects:
Formula: ~1 | Subject
(Intercept) Residual
StdDev: 0.2457355 0.3173421
Fixed effects: Score ~ Condition + as.numeric(Time) + Condition * as.numeric(Time)
Value Std.Error DF t-value p-value
(Intercept) 1.142500 0.2717382 14 4.204415 0.0009
ConditionYes 1.748333 0.3842958 6 4.549447 0.0039
as.numeric(Time) 0.575000 0.1121974 14 5.124898 0.0002
ConditionYes:as.numeric(Time) -0.197500 0.1586710 14 -1.244714 0.2337
Correlation:
(Intr) CndtnY as.(T)
ConditionYes -0.707
as.numeric(Time) -0.826 0.584
ConditionYes:as.numeric(Time) 0.584 -0.826 -0.707
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-1.44560367 -0.65018585 0.01864079 0.52930925 1.40824838
Number of Observations: 24
Number of Groups: 8
Vemos un efecto de condición significativo, lo que indica que la condición ''sí'' tiende a tener puntuaciones más altas (alrededor de 1,7) y un efecto de tiempo significativo, lo que indica que ambos grupos aumentan con el tiempo. Apoyando la trama, no encontramos efecto diferencial de tiempo entre los dos grupos (la interacción). es decir, las pendientes son las mismas.
(usando la biblioteca lme4) Esto ajusta el efecto de su sujeto como aleatorio y también la variable con la que se agrupan sus efectos aleatorios. En este modelo, el efecto aleatorio es la intersección que varía según el sujeto.
m <- lmer( Score ~ Condition + Time + (1|Subject), data=myDat )
Para ver los efectos aleatorios, solo puede usar
ranef(m)
Como mencionó Ian Fellows, sus datos también pueden tener componentes aleatorios de Condición y Tiempo. Puedes probar eso con otro modelo. En la siguiente Condición, Tiempo y la intercepción pueden variar aleatoriamente por tema. También evalúa sus correlaciones.
mi <- lmer( Score ~ Condition + Time + (Condition + Time|Subject), data=myDat )
y prueba
summary(mi)
ranef(mi)
También puede probar esto sin correlaciones con la intersección, con las interacciones entre Condición y Tiempo, y muchos otros modelos para ver cuál se ajusta mejor a sus datos y / o su teoría. Su pregunta es un poco vaga, pero estos pocos comandos deberían ayudarlo a comenzar.
Tenga en cuenta que el sujeto es su factor de agrupación, por lo que es lo que le queda a otros efectos como aleatorio. No es algo que luego también cabe explícitamente como predictor.
No es una respuesta a su pregunta, pero puede encontrar esta visualización de su información informativa.
library(ggplot2)
qplot(Time, Score, data = myDat, geom = "line",
group = Subject, colour = factor(Condition))