Em R, como especifico o modelo lmer sem efeito fixo global? Por exemplo, se eu disser algo como
lmer(y ~ (1 | group) + (0 + x | group), data = my_df)
o modelo ajustado será
Como encaixo o modelo
?
y
primeiro :)
Em R, como especifico o modelo lmer sem efeito fixo global? Por exemplo, se eu disser algo como
lmer(y ~ (1 | group) + (0 + x | group), data = my_df)
o modelo ajustado será
Como encaixo o modelo
?
y
primeiro :)
Respostas:
Como o @Mike Lawrence mencionou, a coisa óbvia a ser feita ao definir um modelo sem efeitos fixos é algo na forma de:
lmer(y ~ -1 + (1|GroupIndicator))
o que é realmente bastante direto; não se define interceptação ou matriz X. A razão básica pela qual isso não funciona é que, como o @maxTC apontou, "o pacote lme4 é dedicado apenas a modelos mistos ".
Em particular o que lmer () montagem faz é calcular o desvio perfilado, resolvendo a regressão dos mínimos quadrados penalizado entre o e , bem como os efeitos aleatórios esféricas e (Eq. (11), Ref. (2) Computacionalmente, esse procedimento de otimização calcula a decomposição de Cholesky do sistema correspondente, explorando a estrutura de blocos do sistema (Eq. (5), Ref. (1)). Definir nenhum efeito fixo global distorce praticamente essa estrutura de bloco de uma maneira que o código de lmer () não pode suportar. Entre outras coisas, o valor condicional esperado de é baseado em , mas está resolvido empergunta a solução de um sistema matricial que nunca existiu (a matriz na Ref. (1) ou na Ref. (2)). Então você recebe um erro como:
Error in mer_finalize(ans) :
Cholmod error 'invalid xtype' at file:../Cholesky/cholmod_solve.c, line 970
Afinal, não havia nada a resolver em primeiro lugar.
Supondo que você não queira reescrever a função de custo de desvio de perfil lmer (), a solução mais fácil é baseada no axioma do CS-101: entrada de lixo, saída de lixo .
N = length(y); Garbage <- rnorm(N);
lmer(y ~ -1 + Garbage + (1|GroupIndicator));
Então, o que fazemos é definir uma variável que é apenas ruído; como antes, lmer () é instruído a não usar interceptação fixa, mas apenas a matriz X nos definiu (nesse caso, a matriz de coluna única Garbage). Essa variável de ruído gaussiana extra estará na expectativa não correlacionada com nossos erros de medição de amostra, bem como com sua variação de efeitos aleatórios. Escusado será dizer que quanto mais estrutura seu modelo tiver, menor a probabilidade de obter correlações aleatórias indesejadas, mas estatisticamente significativas.
Portanto, o lmer () tem uma variável placebo (matriz) para jogar, e você espera que o associado seja zero e você não precisou normalizar seus dados de nenhuma maneira (centralizando-os, branqueando-os etc.) . Provavelmente, tentar uma inicialização aleatória da matriz do placebo também não será prejudicial. Uma nota final para o "Lixo": usar ruído gaussiano não foi "acidental"; possui a maior entropia entre todas as variáveis aleatórias de igual variação, portanto, a menor chance de fornecer um ganho de informação.
Claramente, isso é mais um truque computacional do que uma solução, mas permite que o usuário especifique efetivamente um modelo mais profundo sem efeito fixo global. Desculpas por esperar em torno das duas referências. Em geral, acho que a Ref. (1) é a melhor aposta para qualquer um perceber o que lmer () está fazendo, mas a Ref. (2) está mais próxima do espírito do código real.
Aqui está um pouco do código que mostra a ideia acima:
library(lme4)
N= 500; #Number of Samples
nlevA = 25; #Number of levels in the random effect
set.seed(0) #Set the seed
e = rnorm(N); e = 1*(e - mean(e) )/sd(e); #Some errors
GroupIndicator = sample(nlevA, N, replace=T) #Random Nvel Classes
Q = lmer( rnorm(N) ~ (1| GroupIndicator )); #Dummy regression to get the matrix Zt easily
Z = t(Q@Zt); #Z matrix
RA <- rnorm(nlevA ) #Random Normal Matrix
gammas =c(3*RA/sd(RA)) #Colour this a bit
y = as.vector( Z %*% gammas + e ) #Our measurements are the sum of measurement error (e) and Group specific variance
lmer_native <- lmer(y ~ -1 +(1| GroupIndicator)) #No luck here.
Garbage <- rnorm(N) #Prepare the garbage
lmer_fooled <- lmer(y ~ -1 + Garbage+(1| GroupIndicator)) #OK...
summary(lmer_fooled) #Hey, it sort of works!
Referências:
lmer(y~0+(1|group)+(0+x|group))
funcionaria, mas isso gera um erro.