Obtendo previsões apenas de efeito fixo do modelo misto em novos dados em R

8

Gostaria de construir previsões para um modelo misto (logística via glmer) em um novo conjunto de dados usando apenas os efeitos fixos, mantendo os efeitos aleatórios em 0. Mas estou tendo problemas para configurar a matriz do modelo para poder calculá-los.

Como a classe mer não tem um método de previsão e como desejo omitir os efeitos aleatórios das previsões no novo conjunto de dados, acho que preciso construir uma matriz de modelo para os efeitos fixos da mesma estrutura usada no original modelo, mas usando os novos dados. Em seguida, multiplique pelos coeficientes de efeito fixo no modelo.

A parte de efeito fixo da minha fórmula de modelo contém fatores e termos de interação entre efeitos fixos numéricos, por isso é um pouco mais complicado do que apenas extrair as variáveis ​​fixas da matriz. por exemplo, preciso garantir que a expansão do contraste de fator seja a mesma do original, os termos de interação sejam listados corretamente etc.

Portanto, minha pergunta é: qual é a abordagem geral mais direta para a construção de uma nova matriz de modelo que imita a estrutura da matriz de modelo original usada na criação do modelo?

Eu tentei model.matrix (my.model, data = newdata), mas isso parece retornar a matriz do modelo original, não uma baseada em newdata.

Código de amostra:

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

Tentei outros métodos, como extrair os termos da fórmula e criar uma nova fórmula a partir dela, mas parecia excessivamente complicado e frágil no manuseio de fatores e termos de interação.

Como faço para que mod.mat.cake2 seja uma matriz de modelo de efeito fixo com base na fórmula em m, mas usando valores de cake2? Ou existe uma maneira mais fácil de obter previsões apenas de efeito fixo de um modelo mais recente?

Toda ajuda é apreciada. Obrigado.

colonel.triq
fonte
abordagem muito grosseira, mas simples: se o tempo de computação não é um fator importante (ou seja, você não precisa fazer isso muitas vezes), você pode ajustar os novos dados lm()e extrair a matriz de modelo do ajuste e aplicá-lo ao coeficientes do modelo do ajuste anterior.
Macro

Respostas:

13

Talvez isso seja trapaça, mas

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

Nota:

  • Eu estou usando lme4.0aqui, que é a versão R-forja de "velho" (CRAN) lme4: você pode substituir lme4por lme4.0no código acima
  • a nova versão (r-forge / development) de lme4tem um predictmétodo: nesse caso

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

funciona bem ( re.form=NAdefine todos os efeitos aleatórios para zero, equivalentes aos level=0antigos predict.lme)

Ben Bolker
fonte
1
Obrigado Ben. Tive problemas para obter a primeira solução para funcionar corretamente. Mas mudar para a versão dev do lme4 e usar a função prever / REform = NA faz o truque sem ter que mexer nos detalhes da matriz do modelo. Existem alguns recursos que ainda não parecem ter sido implementados na versão de desenvolvimento que eu estava usando no meu código (em particular, não consigo extrair o efeito aleatório postVars tão facilmente), mas prefiro poderá usar a função de previsão e aguarde até que o novo lme4 seja concluído para as outras peças.
colonel.triq
Pode ser óbvio, mas se você pudesse escrever um exemplo (muito) pequeno e independente do que você quer fazer que não funcione na versão dev e enviá-lo para mim, isso seria útil
Ben Bolker