当我运行这个混合模型时,我获得了所需的所有统计信息。
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
我该如何克服这个问题呢?
发布于 2018-09-16 19:19:54
您的模型:
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)
上面的前两个模型是等价的,因为两个模型都假设没有不同的截获,而后两个模型解决了相同的问题,但使用了两种不同的方法,但并不完全相同:随机回归与异质方差模型。
简而言之,sommer还没有实现随机回归,所以您不能像在lme4中那样在sommer中使用随机截获,而是使用异构方差模型。
干杯,
发布于 2018-09-15 20:58:57
我知道这不是一个优雅的解决方案,但是如何向数据添加截取,以便您可以轻松地在模型中使用它?
我的意思是:
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
https://stackoverflow.com/questions/52348752
复制