Tengo el siguiente tipo de datos. He evaluado a 10 personas cada una repetidas 10 veces. Tengo una matriz de relación de 10x10 (relación entre todas las combinaciones de los individuos).
set.seed(1234)
mydata <- data.frame (gen = factor(rep(1:10, each = 10)),
repl = factor(rep(1:10, 10)),
yld = rnorm(10, 5, 0.5))
Este gen es de diferentes variedades de plantas, por lo que cada una puede cultivarse repetidamente y se mide el rendimiento. La matriz de covarianza es una medida de parentesco por similitud genética calculada por probabilidades ibd en experimentos separados.
library(lme4)
covmat <- round(nearPD(matrix(runif(100, 0, 0.2), nrow = 10))$mat, 2)
diag(covmat) <- diag(covmat)/10+1
rownames(covmat) <- colnames(covmat) <- levels(mydata$gen)
> covmat
10 x 10 Matrix of class "dgeMatrix"
1 2 3 4 5 6 7 8 9 10
1 1.00 0.08 0.06 0.03 0.09 0.09 0.10 0.08 0.07 0.10
2 0.08 1.00 0.08 0.09 0.04 0.12 0.08 0.08 0.11 0.09
3 0.06 0.08 1.00 0.10 0.05 0.09 0.09 0.07 0.04 0.13
4 0.03 0.09 0.10 1.00 0.02 0.11 0.09 0.06 0.04 0.12
5 0.09 0.04 0.05 0.02 1.00 0.06 0.07 0.05 0.02 0.08
6 0.09 0.12 0.09 0.11 0.06 1.00 0.12 0.08 0.07 0.14
7 0.10 0.08 0.09 0.09 0.07 0.12 1.00 0.08 0.03 0.15
8 0.08 0.08 0.07 0.06 0.05 0.08 0.08 1.00 0.06 0.09
9 0.07 0.11 0.04 0.04 0.02 0.07 0.03 0.06 1.00 0.03
10 0.10 0.09 0.13 0.12 0.08 0.14 0.15 0.09 0.03 1.00
Mi modelo es:
yld = gen + repl + error
tanto gen como repl se consideran aleatorios y quiero obtener las estimaciones de efectos aleatorios asociados con cada gen, sin embargo, debo considerar la matriz de relación.
Si es demasiado complejo para adaptarse a modelos anidados, simplemente eliminaría las respuestas del modelo, pero idealmente lo mantendré.
yld = gen + error
¿Cómo puedo lograr esto usando paquetes R, quizás con nlme o lme4? Sé que ASREML puede hacerlo, pero no tengo agarre y me encanta R por ser robusto y libre.
fuente
Respuestas:
Pruebe el
kinship
paquete, que se basa ennlme
. Vea este hilo en modelos mixtos r-sig para más detalles. Me había olvidado de esto cuando intentaba hacerlo para un modelo logístico. Consulte /programming/8245132 para ver un ejemplo resuelto.Para respuestas no normales, necesitaría modificar el paquete pedigreemm, que se basa en lme4. Te acerca, pero la matriz de relación debe crearse a partir de un pedigrí. La siguiente función es una modificación de la
pedigreemm
función que toma una matriz de relación arbitraria en su lugar.El uso es similar a,
pedigreemm
excepto que usted le da la matriz de relación comorelmat
argumento en lugar del pedigrí comopedigree
argumento.Esto no se aplica aquí, ya que tiene diez observaciones / individuo, pero para una observación / individuo necesita una línea más en esta función y un parche menor
lme4
para permitir solo una observación por efecto aleatorio.fuente
nlme
y se necesita algo más complicado quegen + repl
; Además, creo que la correlación necesita llamar a una denlme
las funciones de covarianza / correlacióncovmat
como parámetro. La notación para esto es realmente complicada, así que para decir más, necesitaría Pinhiero / Bates a mano, lo cual no lo hago hoy.lme(yld ~ 1, data = mydata, random = ~ 1 | gen, correlation = corSymm(value=covmatX, form= ~ gen, fixed=TRUE))
, dondecovmatX
hay una versión modificadacovmat
para hacerla comocorSymm
quiera. No estoy seguro de que elform
término sea correcto tampoco.Esta respuesta es una expansión potencial de la sugerencia hecha por Aaron, quien sugirió usar Pedigreem. El pedigreem puede calcular la relación de los proyectos como la siguiente sintaxis, no sé cómo podemos usar esa salida de relación de manera diferente.
El ajuste del modelo mixto del paquete se basa en lme4 para que la sintaxis de la función principal sea similar a la función lme4 del paquete lmer, excepto que puede colocar el objeto genealógico en él.
Sé que esta no es la respuesta perfecta a su pregunta, sin embargo, esto puede ayudar un poco. ¡Me alegra que hayas hecho esta pregunta, interesante para mí!
fuente
require(kinship); model1 <- lmekin(yld ~1, random = ~ 1|gen, varlist =list(covmat), data=mydata)
.model1 <- lmekin(yld ~1, random = ~ 1|gen, varlist =list(covmat), data=mydata)
todavía hay un problema, perdón por publicación prematura. ¿Alguien puede arreglarlo?lmer()
en ellme4
paquete permite efectos aleatorios cruzados. Aquí, usarías algo comoy ~ (1|gen) + (1|repl)
Para una referencia completa;
http://www.stat.wisc.edu/~bates/PotsdamGLMM/LMMD.pdf
fuente