循环使用混合模型中的因变量

时间:2017-05-28 12:03:17

标签: r loops model

我试图在混合模型中循环多个变量(使用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

1 个答案:

答案 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")告诉您只有printplotsummary方法,但{{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(...))

你确定在少数级别的性别和其他类别中做重复性分数是否有意义?

相关问题