繁体   English   中英

在混合模型中循环因变量

[英]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")告诉您只有printplotsummary方法,但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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM