运行此混合模型时,我会获得所需的所有统计信息。
library(sommer)
data(example)
#Model without intercept - OK
ans1 <- mmer2(Yield~Env,
random= ~ Name + Env:Name,
rcov= ~ units,
data=example, silent = TRUE)
summary(ans1)
ans1$u.hat #Random effects
但是,如果我尝试使截距达到随机效果,例如在R库lme4
中,则会出现类似以下错误:
Error in dimnames(x) <- dn :
length of 'dimnames' [2] not equal to array extent
#Model with intercept
ans2 <- mmer2(Yield~Env,
random= ~ 1+Name + Env:Name,
rcov= ~ units,
data=example, silent = TRUE)
summary(ans2)
ans2$u.hat #Random effects
我该如何克服?
答案 0 :(得分:2)
您的型号:
ans1 <- mmer2(Yield~Env,
random= ~ Name + Env:Name,
rcov= ~ units,
data=example, silent = TRUE)
等效于:
ans1.lmer <- lmer(Yield~Env + (1|Name) + (1|Env:Name),
data=example)
使用lme4。请注意,lme4使用符号(x | y)来指定第二项(y项)的每个级别是否存在例如不同的截距(x项),后者是随机回归模型。如果您指定:
ans2.lmer <- lmer(Yield~Env + (Env|Name),
data=example)
您将获得三个方差成分,在Env术语中,三个级别中的每个级别成分之一。 sommer中的等效项不是随机回归,而是使用diag()功能的异构方差模型:
ans2 <- mmer2(Yield~Env,
random= ~ diag(Env):Name,
rcov= ~ units,
data=example, silent = TRUE)
## or in sommer >=3.7
ans2 <- mmer(Yield~Env,
random= ~ vs(ds(Env),Name),
rcov= ~ units,
data=example, silent = TRUE)
上面的前2个模型是等效的,因为两个模型都假定没有不同的截距,而后两个模型则解决相同的问题,但是使用的两种方法并不完全相同;随机回归与异质方差模型。
简而言之,sommer还没有实现随机回归,因此您不能像lme4一样在sommer中使用随机截距,而是使用异构方差模型。
干杯
答案 1 :(得分:0)
我知道这不是一个很好的解决方案,但是如何将拦截添加到数据中,以便您可以轻松地在模型中使用它?
我的意思是:
example <- cbind(example, inter=1)
ans2 <- mmer2(Yield~Env,
random= ~ Name + Env:Name + inter, #here inter are 1's
rcov= ~ units,
data=example, silent = TRUE)
summary(ans2)
ans2$u.hat