Eu tenho o seguinte tipo de dados. Avaliei 10 indivíduos, cada um repetido 10 vezes. Tenho matriz de relação 10x10 (relação entre todas as combinações dos indivíduos).
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))
Essa geração é de variedades diferentes de plantas, de modo que cada uma pode ser cultivada repetidamente e o rendimento é medido. A matriz de covariância é medida de parentesco por similaridade genética calculada pelas probabilidades ibd em 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
Meu modelo é:
yld = gen + repl + error
gen e repl são considerados aleatórios e eu quero obter as estimativas de efeitos aleatórios associados a cada geração, no entanto, preciso considerar a matriz de relacionamento.
Se for muito complexo para caber em modelos aninhados, eu apenas removeria o repl do modelo, mas o ideal é mantê-lo.
yld = gen + error
Como conseguir isso usando pacotes R, talvez com nlme ou lme4? Eu sei que o ASREML pode fazer isso, mas não tenho retenção e amo o R por ser robusto e gratuito.
fonte
Respostas:
Experimente o
kinship
pacote, que é baseadonlme
. Veja este tópico em r-sig-mixed-models para obter detalhes. Eu tinha me esquecido disso enquanto tentava fazer isso por um modelo logístico. Consulte /programming/8245132 para obter um exemplo elaborado.Para respostas não normais, você precisa modificar o pacote pedigreemm, baseado no lme4. Isso o aproxima, mas a matriz de relacionamento deve ser criada a partir de uma linhagem. A função abaixo é uma modificação da
pedigreemm
função que utiliza uma matriz de relacionamento arbitrária.O uso é semelhante a,
pedigreemm
exceto se você fornecer a matriz de relacionamento comorelmat
argumento, em vez da linhagem comopedigree
argumento.Isso não se aplica aqui, pois você tem dez observações / indivíduo, mas para uma observação / indivíduo, você precisa de mais uma linha nesta função e um patch menor
lme4
para permitir apenas uma observação por efeito aleatório.fonte
nlme
e é necessário algo mais complicadogen + repl
; Além disso, acho que a correlação precisa chamar uma dasnlme
funções de covariância / correlaçãocovmat
como parâmetro. A notação para isso é realmente complicada, para dizer mais, eu precisaria de Pinhiero / Bates, o que não preciso hoje.lme(yld ~ 1, data = mydata, random = ~ 1 | gen, correlation = corSymm(value=covmatX, form= ~ gen, fixed=TRUE))
, ondecovmatX
está uma versão modificadacovmat
para fazê-lo comocorSymm
quiser. Também não tenho certeza de que oform
termo seja correto.Essa resposta é uma potencial expansão da sugestão feita por Aaron, que sugeriu o uso de Pedigreem. O pedigreem pode calcular o relacionamento dos projetos como segue a sintaxe, não sei como podemos usar essa saída de relacionamento de maneira diferente.
O ajuste do modelo misto do pacote é baseado no lme4, pois a sintaxe da função principal é semelhante à função lmer da função do pacote lme4, exceto que você pode colocar o objeto de linhagem nele.
Sei que essa não é a resposta perfeita para sua pergunta, mas isso pode ajudar um pouco. Fico feliz que você fez esta pergunta, interessante para mim!
fonte
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)
ainda há um problema, desculpe-me por postagens prematuras. Alguém pode consertar isso?lmer()
nolme4
pacote permite efeitos aleatórios cruzados. Aqui, você usaria algo comoy ~ (1|gen) + (1|repl)
Para uma referência completa;
http://www.stat.wisc.edu/~bates/PotsdamGLMM/LMMD.pdf
fonte