如何通过循环/自定义函数向函数添加参数?

时间:2018-07-22 20:11:53

标签: r arguments metafor

我正在进行荟萃分析,需要分析多个主持人。 我正在使用rma.uni函数,并具有与我正在测试的所有主持人相同的代码:

res <- rma.uni(method = "HS", measure = "SMD", m1i = EXPM, m2i = CONM, sd1i = EXPSD, sd2i = CONSD, n1i = EXPN, n2i = CONN, slab=paste(AUTHOR, YEAR, sep=", "), data = outcomeData)

我想添加参数“ mods =〜x”,其中x是我正在测试的主持人(例如YEAR或AUTHOR),然后对主持人的组合列表进行for循环。

我尝试了几种不同的方法,但是在解释错误消息时遇到了困难。

mod.test <- c("AUTHOR", "YEAR")

for (i in mod.test){
  res <- rma.uni(method = "HS", measure = "SMD", m1i = EXPM, m2i = CONM, sd1i = EXPSD, sd2i = CONSD, n1i = EXPN, n2i = CONN, slab=paste(AUTHOR, YEAR, sep=", "), mods = ~ i, data = outcomeData)
  print(res)
}

mod.test <- c("AUTHOR", "YEAR")

for (x in mod.test){
  i <- paste("mods = ~ ", x)
  res <- rma.uni(method = "HS", measure = "SMD", m1i = EXPM, m2i = CONM, sd1i = EXPSD, sd2i = CONSD, n1i = EXPN, n2i = CONN, slab=paste(AUTHOR, YEAR, sep=", "), mods = ~ i, data = outcomeData)
  print(res)
}

都给出错误:

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

由于我不知道您使用的数据集,所以我改用了基础数据。

您需要使用直接索引而不是提供名称。根据您的情况,请在循环内尝试outcomeData[[i]]。由于您数据中的列名与您的不匹配,我对您的模型进行了一些更改。

mod.test <- c("author", "year")

for (i in mod.test){
print(i)
res <- rma.uni(method = "HS", measure = "SMD",
 m1i = ablat, m2i = ablat, sd1i = ablat, sd2i = ablat,
 n1i = ablat, n2i = ablat, 
slab=paste(author, year, sep=", "),mods= ~dat.bcg[[i]],data = dat.bcg)

  print(res)
}

因此,请尝试此操作。

mod.test <- c("AUTHOR", "YEAR")

for (i in mod.test){
  res <- rma.uni(method = "HS", measure = "SMD", m1i = EXPM, 
            m2i = CONM, sd1i = EXPSD, sd2i = CONSD, 
            n1i = EXPN, n2i = CONN, slab=paste(AUTHOR, YEAR, sep=", "), 
            mods = ~outcomeData[[i]], data = outcomeData)
  print(res)
}

您可以在this问题中找到有关此信息的更多信息。

答案 1 :(得分:0)

我做了Maydin的建议,这是我的固定代码。

mod.test <-c(“ YEAR”,“ TASK”)

for (i in mod.test){
  res <- rma.uni(method = "HS", measure = "SMD", 
                 m1i = EXPM, m2i = CONM, sd1i = EXPSD, 
                 sd2i = CONSD, n1i = EXPN, n2i = CONN, 
                 slab=paste(AUTHOR, YEAR, sep=", "), 
                 mods = ~outcomeData[[i]], 
                 data = outcomeData)
  print(i)
  print(res)

一个困难是我使用“ AUTHOR”作为测试主持人,但这会导致错误:

Error in rma.uni(method = "HS", measure = "SMD", m1i = EXPM, m2i = CONM,  : 
  Number of parameters to be estimated is larger than the number of observations.
In addition: Warning message:
In rma.uni(method = "HS", measure = "SMD", m1i = EXPM, m2i = CONM,  :
  Redundant predictors dropped from the model.

我认为是因为每个研究在我的示例数据集中都有一位独特的作者。