J'ai le type de données suivant. J'ai évalué 10 individus chacun répété 10 fois. J'ai une matrice de relations 10x10 (relation entre toutes les combinaisons des individus).
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))
Cette génération est constituée de différentes variétés de plantes, chacune peut donc être cultivée à plusieurs reprises et le rendement est mesuré. La matrice de covariance est une mesure de parenté par similitude génétique calculée par les probabilités ibd dans des expériences séparées.
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
Mon modèle est:
yld = gen + repl + error
gen et repl sont considérés comme aléatoires et je veux obtenir les estimations de l'effet aléatoire associées à chaque génération, mais je dois prendre en compte la matrice de relation.
S'il est trop complexe pour s'adapter à des modèles imbriqués, je supprimerais simplement repl du modèle, mais idéalement je le garderai.
yld = gen + error
Comment puis-je y parvenir en utilisant des packages R, peut-être avec nlme ou lme4? Je sais qu'ASREML peut le faire mais je n'ai pas de prise et j'aime R pour être robuste aussi bien que gratuit.
la source
Réponses:
Essayez le
kinship
package, qui est basé surnlme
. Voir ce fil sur les modèles r-sig-mixed-pour plus de détails. J'avais oublié cela alors que j'essayais de le faire pour un modèle logistique. Voir /programming/8245132 pour un exemple élaboré.Pour les réponses non normales, vous devez modifier le package pedigreemm, qui est basé sur lme4. Cela vous rapproche, mais la matrice des relations doit être créée à partir d'un pedigree. La fonction ci-dessous est une modification de la
pedigreemm
fonction qui prend à la place une matrice de relation arbitraire.L'utilisation est similaire,
pedigreemm
sauf que vous lui donnez la matrice de relation commerelmat
argument au lieu du pedigree commepedigree
argument.Cela ne s'applique pas ici car vous avez dix observations / individu, mais pour une observation / individu, vous avez besoin d'une ligne de plus dans cette fonction et d'un patch mineur
lme4
pour ne permettre qu'une seule observation par effet aléatoire.la source
nlme
et quelque chose de plus compliqué est nécessairegen + repl
; aussi, je pense que la corrélation doit appeler une des fonctionsnlme
de covariance / corrélation aveccovmat
comme paramètre. La notation pour cela est vraiment délicate, donc pour en dire plus, j'aurais besoin de Pinhiero / Bates, ce que je n'ai pas aujourd'hui.lme(yld ~ 1, data = mydata, random = ~ 1 | gen, correlation = corSymm(value=covmatX, form= ~ gen, fixed=TRUE))
, où secovmatX
trouve une version modifiée decovmat
pour qu'elle lecorSymm
veuille cependant . Je ne suis pas sûr non plus que leform
terme soit correct.Cette réponse est une extension potentielle de la suggestion faite par Aaron, qui a suggéré d'utiliser Pedigreem. Le pedigreem peut calculer la relation à partir des projets comme la syntaxe suivante, je ne sais pas comment nous pouvons utiliser une telle sortie de relation de manière différente.
L'ajustement de modèle mixte du package est basé sur lme4 car la syntaxe de la fonction principale est similaire à la fonction de package lme4, fonction lmer, sauf que vous pouvez y insérer l'objet pedigree.
Je sais que ce n'est pas la réponse parfaite à votre question, mais cela peut aider un peu. je suis content que vous ayez posé cette question qui m'intéresse!
la source
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)
il y a toujours un problème, désolé pour une publication prématurée. Quelqu'un peut-il le réparer?lmer()
dans l'lme4
emballage permet des effets aléatoires croisés. Ici, vous utiliseriez quelque chose commey ~ (1|gen) + (1|repl)
Pour une référence complète;
http://www.stat.wisc.edu/~bates/PotsdamGLMM/LMMD.pdf
la source