将混合模型公式从SAS转换为R.

jon*_*jon 5 r sas

我想在R中使用nlme包来拟合混合模型,这相当于以下SAS代码:

proc mixed data = one;
class var1 var2  year loc rep;
model yld = var1 * var2;
random loc year(loc) rep*year(loc);
Run Code Online (Sandbox Code Playgroud)

编辑:解释什么是实验

在重复中测试var1和var2的相同组合(重复重复编号为1:3).重复(rep)被认为是随机的.在位置(loc)和年(年)重复这组实验.虽然复制品在每个位置和年份内编号为1:3,因为它们没有任何名称,但是在一个位置和一年内的复制1在其他位置和其他年份内没有相关复制1

我尝试了以下代码:

 require(nlme) 
    fm1 <- lme(yld ~ var1*var2, data = one, random = loc + year / loc + rep * year / loc)  
Run Code Online (Sandbox Code Playgroud)

我的代码是否正确?

编辑:数据和模型基于您可以从以下链接下载示例数据文件的建议:https: //sites.google.com/site/johndatastuff/mydata1.csv

data$var1 <- as.factor(data$var1)
data$var2 <- as.factor(data$var2)
data$year <- as.factor(data$year)
data$loc <- as.factor(data$loc)
data$rep <- as.factor(data$rep)

following suggestions from the comments below:
fm1 <- lme(yld ~ var1*var2, data = data, random = ~ loc + year / loc + rep * year / loc)

Error in getGroups.data.frame(dataMix, groups) : 
  Invalid formula for groups
Run Code Online (Sandbox Code Playgroud)

基于SAS输出的预期

Type 3 tests of fixed effects 
var1*var2         14         238       F value 16.12 Pr >F = < 0.0001

Covariance parameters:
loc = 0, year(loc) = 922161, year*rep(loc) = 2077492, residual = 1109238 
Run Code Online (Sandbox Code Playgroud)

我尝试了以下模型,我仍然遇到一些错误:

Edits: Just for information I tried the following model
require(lme4)  
 fm1 <- lmer(yld ~ var1*var2 + (1|loc) +  (1|year / loc) + (1|rep : (year / loc)),  
            data = data)  
Error in rep:`:` : NA/NaN argument 
In addition: Warning message: 
In rep:`:` : numerical expression has 270 elements: only the first used
Run Code Online (Sandbox Code Playgroud)

Aar*_*ica 4

感谢您提供更详细的信息。我将数据存储起来是d为了避免与data函数和参数混淆;这些命令可以以任何方式工作,但这种避免data通常被认为是良好的做法。

var请注意,由于和之间缺乏平衡,交互很难拟合var2;以下是交叉表供参考:

> xtabs(~var1 + var2, data=d)
    var2
var1  1  2  3  4  5
   1 18 18 18 18 18
   2  0 18 18 18 18
   3  0  0 18 18 18
   4  0  0  0 18 18
   5  0  0  0  0 18
Run Code Online (Sandbox Code Playgroud)

通常为了适应交互作用(并且没有主效应),您会使用:而不是*,但在这里最好使用单个因素,如下所示:

d$var12 <- factor(paste(d$var1, d$var2, sep=""))
Run Code Online (Sandbox Code Playgroud)

然后用nlme, 尝试

fm1 <- lme(yld ~ var12, random = ~ 1 | loc/year/rep, data = d)
anova(fm1)
Run Code Online (Sandbox Code Playgroud)

并与lme4, 尝试

fm1 <- lmer(yld ~ var12 + (1 | loc/year/rep), data=d)
anova(fm1)
Run Code Online (Sandbox Code Playgroud)

另请注意,由于nlmelme4的函数名称重叠,因此您每次只需将一个加载到 R 会话中;要切换,您需要关闭 R 并重新启动。(还存在其他方法,但这是最容易解释的方法。)