我试图在混合模型中循环多个变量(使用rptGaussian
包中的rptR
函数)但是尽管付出了一些努力,但我无法做到这一点。我正在尝试以下代码。我使用以下代码没有循环,它工作正常:
(rptGaussian(Arg ~ (1|class)+(1|kit)+(1|sex),
grname=c("class","kit","sex","Fixed"),
data=ggm2, nboot=10, npermut=10, adjusted=FALSE)
然而,当我尝试循环更多变量时,我得到了错误
terms.default(公式)中的错误:没有术语组件也没有属性
我正在为循环尝试以下代码。
varlist<-c("var1", "var2")
blups.models <- lapply(varlist, function(x) {
rptGaussian(substitute(i ~ (1|class)+(1|kit)+(1|sex),
list(i = as.name(x))),
grname=c("class","kit","lab","Fixed"),
data=ggm2, nboot=10, npermut=10, adjusted=FALSE)
})
这是一个虚拟数据表:
sex class kit var1 var2 var3 var4
Female A Cont 10.79730768 10 20 18
Female A Exp 11.2474347 17 1 17
Female A Cont 11.64820939 10 5 17
Female A Exp 15.62800413 20 8 4
Female B Cont 12.41705885 5 16 8
Female B Exp 12.80249244 9 10 1
Female B Cont 10.76949177 6 13 2
Female B Exp 14.71370141 7 12 11
Male A Cont 8.931529823 8 3 6
Male A Exp 10.46899683 3 12 13
Male A Cont 8.363257621 3 13 17
Male A Exp 8.753117911 10 16 10
Male B Cont 9.110946315 9 13 4
Male B Exp 9.595131886 18 10 17
Male B Cont 9.454670188 1 10 11
Male B Exp 10.59379123 11 1 3
答案 0 :(得分:0)
通常,这种循环使用基于字符串的解决方案(尤其是reformulate()
包装函数)比使用substitute()
更容易(IMO)。
我使用read.table(header=TRUE,text="...")
来读取上面的数据以及针对单个模型稍微修改过的代码:
library(rptR)
r1 <- rptGaussian(var1 ~ (1|class)+(1|kit)+(1|sex),
grname=c("class","kit","sex","Fixed"),
data=ggm2, nboot=10, npermut=10, adjusted=FALSE)
对于多种型号:
varlist <- c("var1", "var2")
制作公式列表:
formulas <- lapply(varlist,
reformulate,
termlabels="(1|class)+(1|kit)+(1|sex)")
将rptGaussian
应用于公式:
blups.models <- lapply(formulas,
rptGaussian,
grname=c("class","kit","sex","Fixed"),
data=ggm2, nboot=10, npermut=10, adjusted=FALSE)
如果要将结果折叠为漂亮的表单,则必须弄清楚如何将单拟合的结果提取到数据框或类似结构中。在这种情况下,结果是rpt
对象,methods(class="rpt")
告诉您只有print
,plot
和summary
方法,但{{1}方法返回一个具有大量潜在有用位的对象。这是一个例子:
summary()
可能更好的替代方案是返回## extract estimates and standard errors of estimates as a 1-row data frame
sumfun <- function(x) {
ss <- summary(x)
se.names <- paste(rownames(ss$se),"se",sep=".")
cbind(ss$R,setNames(as.data.frame(t(ss$se)),se.names))
}
(3列乘n行数据帧)。
我将使用data.frame(term=names(ss$R),rpt=unlist(ss$R),se=ss$se)
,因为它很方便,但如果您愿意,可以使用base-R工具(dplyr::bind_rows()
)。
do.call(rbind(...))
你确定在少数级别的性别和其他类别中做重复性分数是否有意义?