以下型号有什么问题:
# simulated data yr = 2; vg = 4, fm = 5, gen = 5
mbb <- data.frame( trait1 = rnorm(200, 15, 4),yr = c(rep (1:2, each = 100)),
vg = c(rep(rep(1:4, each =25), 2)), fm = rep(rep(1:5, each = 5), 8),
gen = sample(c(1:5), 200, replace = T))
require(lme4)
lmer(trait1 ~ (yr + vg + gen)^3 + (yr + vg + gen|fm:vg), data= mbb)# full model
我收到以下错误:
Error in validObject(.Object) :
invalid class "mer" object: Slot Zt must by dims['q'] by dims['n']*dims['s']
In addition: Warning messages:
1: In fm:vg : numerical expression has 200 elements: only the first used
2: In fm:vg : numerical expression has 200 elements: only the first used
答案 0 :(得分:7)
问题恰恰在于fm
和vg
存储为数字,而不是因子,因此lmer
会尝试将fm:vg
解释为序列运算符(请参阅{ {1}})而不是交互操作符(请参阅?seq
)。你可以:
?interaction
和fm
转换为数据框中的因素(vg
)[从您的设置中不清楚您是否需要mbb <- transform(mbb,vg=factor(vg),fm=factor(fm))
和{{1成为因素或连续预测因素......这种区别非常重要,当然......如果你想要它们作为连续预测因子,那么将它们视为分组目的的因素有点奇怪...... / em>] vg
fm
)使用Jim M.的解决方案
我认为这些都会奏效,但我必须承认我没有测试过它们。
答案 1 :(得分:3)
将交互建模为随机效应的一种可能解决方案是将交互项添加为mbb数据框中的附加列。
mbb$fmvg <- with(mbb, interaction(fm,vg, sep=":"))
然后模型变为
lmer(trait1 ~ (yr + vg + gen)^3 + (yr + vg + gen|fmvg), data= mbb)