[英]Looping over dependent variable in a mixed model
我试图在混合模型中循环多个变量(使用rptR
包中的rptGaussian
函数)但是尽管付出了一些努力,但我无法做到这一点。 我正在尝试以下代码。 我使用以下代码没有循环,它工作正常:
(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
一般来说,使用基于字符串的解决方案(尤其是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
方法,但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))
}
一个可能更好的选择是返回data.frame(term=names(ss$R),rpt=unlist(ss$R),se=ss$se)
(一个3列乘n行数据帧) 。
我将使用dplyr::bind_rows()
因为它很方便,但如果您愿意,可以使用base-R工具( do.call(rbind(...))
)。
names(blups.models) <- varlist
dplyr::bind_rows(lapply(blups.models,sumfun),
.id="var")
var class kit sex Fixed class.se kit.se sex.se Fixed.se
1 var1 0 0.1444659 0.65887365 0 0.04992624 0.2136589 0.2954982 0
2 var2 0 0.3322780 0.01734343 0 0.01981748 0.2243989 0.1158878 0
你确定在少数级别的性别和其他类别中做重复性评分是否有意义?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.