Obtention de prédictions à effet fixe uniquement à partir d'un modèle mixte sur de nouvelles données dans R

8

Je voudrais construire des prédictions pour un modèle mixte (logistique via glmer) sur un nouvel ensemble de données en utilisant uniquement les effets fixes, en maintenant les effets aléatoires à 0. Mais j'ai du mal à configurer la matrice du modèle pour pouvoir les calculer.

Étant donné que la classe mer n'a pas de méthode de prédiction et que je souhaite omettre les effets aléatoires pour les prédictions sur le nouvel ensemble de données, je pense que je dois construire une matrice de modèle pour les effets fixes de la même structure utilisée dans l'original modèle, mais en utilisant les nouvelles données. Multipliez ensuite par les coefficients à effet fixe dans le modèle.

La partie à effet fixe de ma formule de modèle contient des facteurs et des termes d'interaction entre les effets fixes numériques, c'est donc un peu plus compliqué que d'extraire simplement les variables fixes de la matrice. Par exemple, je dois m'assurer que l'expansion du contraste du facteur est la même que l'original, les termes d'interaction sont correctement répertoriés, etc.

Ma question est donc la suivante: quelle est l'approche générale la plus simple pour construire une nouvelle matrice de modèle qui imite la structure de la matrice de modèle d'origine utilisée pour créer le modèle?

J'ai essayé model.matrix (my.model, data = newdata) mais cela semble renvoyer la matrice de modèle d'origine, pas une basée sur newdata.

Exemple de code:

library(lme4)

cake2 <- head(cake) # cake2 is "new" data frame for future predictions

# recipe is a fixed effect factor, temp is fixed effect numeric, replicate is random effect
m <- lmer(angle ~ temp + recipe + (1 | replicate), data=cake)
summary(m)

nrow(cake2)         # but new data frame has 6 rows
nrow(cake)          # original data frame has 270 rows

# attempt to make new model matrix using different data frame
mod.mat.cake2 <- model.matrix(m, data=cake2)
nrow(mod.mat.cake2) # 270 rows, same as orig data frame

J'ai essayé d'autres méthodes comme extraire les termes de la formule et en construire une nouvelle, mais cela semblait trop compliqué et fragile dans la gestion des facteurs et des termes d'interaction.

Comment puis-je obtenir que mod.mat.cake2 soit une matrice de modèle à effet fixe basée sur la formule en m, mais en utilisant les valeurs de cake2? Ou existe-t-il un moyen plus simple d'obtenir des prédictions à effet fixe uniquement à partir d'un modèle lmer?

Toute aide est appréciée. Je vous remercie.

colonel.triq
la source
approche très grossière mais simple: si le temps de calcul n'est pas un facteur majeur (c'est-à-dire que vous n'avez pas à le faire une tonne de fois), vous pouvez ajuster les nouvelles données lm()et extraire la matrice du modèle de l'ajustement, et l'appliquer à la coefficients du modèle de l'ajustement précédent.
Macro

Réponses:

13

C'est peut-être de la triche, mais

fixedformula <- as.formula(lme4.0:::nobars(formula(m))[-2])
model.matrix(fixedformula,newdata=cake2)

Remarque:

  • J'utilise lme4.0ici, qui est la version r-forge de « vieux » (CRAN) lme4: vous pouvez remplacer lme4par lme4.0le code ci - dessus
  • la nouvelle version (r-forge / development) de lme4possède une predictméthode: dans ce cas

    predict(m,re.form=NA,newdata=cake2)

fonctionne bien ( re.form=NAmet tous les effets aléatoires à zéro, équivalent à level=0l'ancien predict.lme)

Ben Bolker
la source
1
Merci Ben. J'ai eu du mal à faire fonctionner correctement la première solution. Mais passer à la version dev de lme4 et utiliser la fonction predire / REform = NA fait l'affaire sans avoir à jouer avec les détails de la matrice du modèle. Il y a quelques fonctionnalités qui ne semblent pas encore être implémentées dans la version de développement que j'utilisais dans mon code (en particulier, je n'arrive pas à extraire les postVars à effet aléatoire aussi facilement), mais je préfère être en mesure d'utiliser la fonction de prédiction et d'attendre que le nouveau lme4 soit terminé pour les autres pièces.
colonel.triq
Cela peut être évident, mais si vous pouviez écrire un (très) petit exemple autonome de ce que vous voulez faire qui ne fonctionne pas dans la version de développement et me l'envoyer, ce serait utile
Ben Bolker