r sas mixed-models

Conversión de fórmula de modelo mixto de medidas repetidas de SAS a R



mixed-models (2)

Por favor intente abajo:

model1 <- lme( Y ~ GROUP + X1, random = ~ GROUP | person, correlation = corCompSymm(form = ~ day | person), na.action = na.exclude, data = df1, method = "REML" ) summary(model1)

Creo que al random = ~ groupvar | subjvar random = ~ groupvar | subjvar opción random = ~ groupvar | subjvar con R lme proporciona un resultado similar de la repeated / subject = subjvar group = groupvar con SAS/MIXED en este caso.

Editar:

SAS / MIXED

R (un modelo revisado2)

model2 <- lme( Y ~ GROUP + X1, random = list(person = pdDiag(form = ~ GROUP - 1)), correlation = corCompSymm(form = ~ day | person), weights = varIdent(form = ~ 1 | GROUP), na.action = na.exclude, data = df1, method = "REML" ) summary(model2)

Entonces, creo que estas estructuras de covarianza son muy similares (σ g1 = τ g 2 + σ 1 ).

Editar 2:

Estimaciones de covariables (SAS / MIXED):

Variance person GROUP TEST 8789.23 CS person GROUP TEST 125.79 Variance person GROUP CONTROL 82775 CS person GROUP CONTROL 33297

Asi que

TEST group diagonal element = 125.79 + 8789.23 = 8915.02 CONTROL group diagonal element = 33297 + 82775 = 116072

donde elemento diagonal = σ k1 + σ k 2 .

Estimaciones de covariables (R lme):

Random effects: Formula: ~GROUP - 1 | person Structure: Diagonal GROUP1TEST GROUP2CONTROL Residual StdDev: 14.56864 184.692 93.28885 Correlation Structure: Compound symmetry Formula: ~day | person Parameter estimate(s): Rho -0.009929987 Variance function: Structure: Different standard deviations per stratum Formula: ~1 | GROUP Parameter estimates: 1TEST 2CONTROL 1.000000 3.068837

Asi que

TEST group diagonal element = 14.56864^2 + (3.068837^0.5 * 93.28885 * -0.009929987) + 93.28885^2 = 8913.432 CONTROL group diagonal element = 184.692^2 + (3.068837^0.5 * 93.28885 * -0.009929987) + (3.068837 * 93.28885)^2 = 116070.5

donde elemento diagonal = τ g 2 + σ 1 + σ g 2 .

Hay varias preguntas y publicaciones sobre modelos mixtos para diseños experimentales más complejos, así que pensé que este modelo más simple ayudaría a otros principiantes en este proceso, así como a mí mismo.

Entonces, mi pregunta es: me gustaría formular un ancova de medidas repetidas en R a partir del procedimiento mixto sas proc:

proc mixed data=df1; FitStatistics=akaike class GROUP person day; model Y = GROUP X1 / solution alpha=.1 cl; repeated / type=cs subject=person group=GROUP; lsmeans GROUP; run;

Aquí está la salida SAS usando los datos creados en R (abajo):

. Effect panel Estimate Error DF t Value Pr > |t| Alpha Lower Upper Intercept -9.8693 251.04 7 -0.04 0.9697 0.1 -485.49 465.75 panel 1 -247.17 112.86 7 -2.19 0.0647 0.1 -460.99 -33.3510 panel 2 0 . . . . . . . X1 20.4125 10.0228 7 2.04 0.0811 0.1 1.4235 39.4016

A continuación se muestra cómo formulé el modelo en R usando el paquete ''nlme'', pero no obtengo estimaciones de coeficientes similares:

## create reproducible example fake panel data set: set.seed(94); subject.id = abs(round(rnorm(10)*10000,0)) set.seed(99); sds = rnorm(10,15,5);means = 1:10*runif(10,7,13);trends = runif(10,0.5,2.5) this = NULL; set.seed(98) for(i in 1:10) { this = c(this,rnorm(6, mean = means[i], sd = sds[i])*trends[i]*1:6)} set.seed(97) that = sort(rep(rnorm(10,mean = 20, sd = 3),6)) df1 = data.frame(day = rep(1:6,10), GROUP = c(rep(''TEST'',30),rep(''CONTROL'',30)), Y = this, X1 = that, person = sort(rep(subject.id,6))) ## use package nlme require(nlme) ## run repeated measures mixed model using compound symmetry covariance structure: summary(lme(Y ~ GROUP + X1, random = ~ +1 | person, correlation=corCompSymm(form=~day|person), na.action = na.exclude, data = df1,method=''REML''))

Ahora, la salida de R, que ahora me doy cuenta es similar a la salida de lm() :

Value Std.Error DF t-value p-value (Intercept) -626.1622 527.9890 50 -1.1859379 0.2413 GROUPTEST -101.3647 156.2940 7 -0.6485518 0.5373 X1 47.0919 22.6698 7 2.0772934 0.0764

Creo que estoy cerca de la especificación, pero no estoy seguro de qué pieza me falta para que los resultados coincidan (dentro de lo razonable ...). ¡Cualquier ayuda sería apreciada!

ACTUALIZACIÓN: Usando el código en la respuesta a continuación, la salida R se convierte en:

> summary(model2)

Desplácese hacia abajo para ver las estimaciones de los parámetros: ¡mire! idéntico a SAS.

Linear mixed-effects model fit by REML Data: df1 AIC BIC logLik 776.942 793.2864 -380.471 Random effects: Formula: ~GROUP - 1 | person Structure: Diagonal GROUPCONTROL GROUPTEST Residual StdDev: 184.692 14.56864 93.28885 Correlation Structure: Compound symmetry Formula: ~day | person Parameter estimate(s): Rho -0.009929987 Variance function: Structure: Different standard deviations per stratum Formula: ~1 | GROUP Parameter estimates: TEST CONTROL 1.000000 3.068837 Fixed effects: Y ~ GROUP + X1 Value Std.Error DF t-value p-value (Intercept) -9.8706 251.04678 50 -0.0393178 0.9688 GROUPTEST -247.1712 112.85945 7 -2.1900795 0.0647 X1 20.4126 10.02292 7 2.0365914 0.0811


Oooh, esto va a ser complicado, y si es posible con las funciones estándar de nlme, va a tomar un estudio serio de Pinheiro / Bates.

Sin embargo, antes de dedicar el tiempo a hacerlo, debe asegurarse de que este sea el modelo exacto que necesita. Quizás haya algo más que encaje mejor en la historia de tus datos. O tal vez haya algo que R pueda hacer más fácilmente que sea igual de bueno, pero no exactamente igual.

Primero, aquí está mi opinión sobre lo que estás haciendo en SAS con esta línea:

repeated / type=cs subject=person group=GROUP;

Este type=cs subject=person está induciendo la correlación entre todas las medidas en la misma persona, y esa correlación es la misma para todos los pares de días. El group=GROUP permite que la correlación para cada grupo sea diferente.

Por el contrario, aquí está mi opinión sobre lo que está haciendo su código R:

random = ~ +1 | person, correlation=corCompSymm(form=~day|person)

Este código en realidad está agregando casi el mismo efecto de dos maneras diferentes; la línea random está agregando un efecto aleatorio para cada persona, y la línea de correlation está induciendo la correlación entre todas las medidas en la misma persona. Sin embargo, estas dos cosas son casi idénticas; si la correlación es positiva, obtienes exactamente el mismo resultado al incluir cualquiera de ellos. No estoy seguro de qué sucede cuando incluye ambos, pero sí sé que solo uno es necesario. De todos modos, este código tiene la misma correlación para todas las personas, no permite que cada grupo tenga su propia correlación.

Para que cada grupo tenga su propia correlación, creo que debes construir una estructura de correlación más complicada a partir de dos piezas diferentes; Nunca he hecho esto, pero estoy bastante seguro de recordar que Pinheiro / Bates lo está haciendo.

En su lugar, podría considerar agregar un efecto aleatorio para una persona y luego dejar que la varianza sea diferente para los diferentes grupos con weights=varIdent(form=~1|group) (desde la memoria, verifique mi sintaxis, por favor). Esto no será lo mismo pero cuenta una historia similar. La historia en SAS es que las mediciones en algunos individuos están más correlacionadas que las mediciones en otros individuos. Pensando en lo que eso significa, las mediciones para individuos con mayor correlación estarán más juntas que las mediciones para individuos con una menor correlación. En contraste, la historia en R es que la variabilidad de las mediciones dentro de los individuos varía; pensando en eso, las mediciones con mayor variabilidad tienen una correlación menor. Entonces sí cuentan historias similares, pero llegan desde lados opuestos.

Incluso es posible (pero me sorprendería) que estos dos modelos terminen siendo parametrizaciones diferentes de la misma cosa. Mi intuición es que la variabilidad general de la medición será diferente de alguna manera. Pero incluso si no son lo mismo, valdría la pena escribir las parametrizaciones solo para asegurarse de que las comprende y para asegurarse de que estén describiendo adecuadamente la historia de sus datos.