Je fais une étude de simulation qui nécessite des estimations d'amorçage obtenues à partir d'un modèle mixte linéaire généralisé (en fait, le produit de deux estimations pour les effets fixes, une à partir d'un GLMM et l'autre à partir d'un LMM). Pour bien faire l'étude, il faudrait environ 1000 simulations avec 1000 ou 1500 réplications bootstrap à chaque fois. Cela prend beaucoup de temps sur mon ordinateur (plusieurs jours).
How can I speed up the computation of these fixed effects?
Pour être plus précis, j'ai des sujets qui sont mesurés de manière répétée de trois manières, donnant lieu aux variables X, M et Y, où X et M sont continus et Y est binaire. Nous avons deux équations de régression où Y est la variable continue latente sous-jacente pour et les erreurs ne sont pas iid. La statistique que nous voulons démarrer est . Ainsi, chaque réplication bootstrap nécessite l'ajustement d'un LMM et d'un GLMM. Mon code R est (en utilisant lme4)
stat=function(dat){
a=fixef(lmer(M~X+(X|person),data=dat))["X"]
b=fixef(glmer(Y~X+M+(X+M|person),data=dat,family="binomial"))["M"]
return(a*b)
}
Je me rends compte que j'obtiens la même estimation pour si je l' comme un modèle linéaire, ce qui fait gagner du temps, mais la même astuce ne fonctionne pas pour .
Dois-je simplement acheter un ordinateur plus rapide? :)
Rprof
.Réponses:
Cela devrait aider à spécifier les valeurs de départ, bien qu'il soit difficile de savoir combien. Lorsque vous effectuez une simulation et un amorçage, vous devez connaître les «vraies» valeurs ou les estimations non amorcées ou les deux. Essayez d'utiliser ceux de l'
start =
optionglmer
.Vous pouvez également envisager de vérifier si les tolérances pour déclarer la convergence sont plus strictes que vous n'en avez besoin. Je ne sais pas cependant comment les modifier à partir de la
lme4
documentation.la source
Deux autres possibilités sont également à considérer, avant d'acheter un nouvel ordinateur.
la source
Ce pourrait être un ordinateur plus rapide. Mais voici une astuce qui peut fonctionner.
Générez une simultanéation de , mais seulement conditionnelle à , puis faites juste OLS ou LMM sur les valeurs simulées .Y∗ Y Y∗
Supposons que votre fonction de liaison soit . cela indique comment vous obtenez de la probabilité de à la valeur , et est très probablement la fonction logistique .g(.) Y=1 Y∗ g(z)=log(z1−z)
Donc, si vous supposez une distribution d'échantillonnage bernouli pour , puis utilisez les jeffreys avant pour la probabilité, vous obtenez une bêta postérieure pour . La simulation à partir de cela devrait être comme l'éclairage, et si ce n'est pas le cas, vous avez besoin d'un ordinateur plus rapide. De plus, les échantillons sont indépendants, donc pas besoin de vérifier les diagnostics de "convergence" comme dans MCMC, et vous n'avez probablement pas besoin d'autant d'échantillons - 100 peuvent fonctionner correctement pour votre cas. Si vous avez des binomiaux , remplacez simplement le du postérieur ci-dessus par , le nombre d'essais du binôme pour chaque .Y→Y∼Bernoulli(p) p∼Beta(Yobs+12,1−Yobs+12) Y′s 1 ni Yi
Vous avez donc un ensemble de valeurs simulées . Vous appliquez ensuite la fonction de lien à chacune de ces valeurs, pour obtenir . Ajustez un LMM à , ce qui est probablement plus rapide que le programme GLMM. Vous pouvez fondamentalement ignorer les valeurs binaires d'origine (mais ne les supprimez pas!), Et simplement travailler avec la "matrice de simulation" ( , où est la taille de l'échantillon et est le nombre de simulations).psim Ysim=g(psim) Ysim N×S N S
Donc, dans votre programme, je remplacerais la fonction fonction , et par une seule simultation, vous créeriez alors une sorte de boucle qui applique la fonction à chaque simulation, puis prend la moyenne comme l'estimation de . Quelque chose commegmler() lmer() Y lmer() b
Faites-moi savoir si j'ai besoin d'expliquer quelque chose de plus clair
la source