在R中的数据框中的列子集上拟合模型

时间:2018-12-19 15:46:25

标签: r formula lm

我正在尝试在协变量的子集上使用lm()和matchit()。我已经生成了任意数量的带有前缀“ covar”的列,即“ covar.1”,“ covar.2”等。我想做类似的事情

lm(group〜covars,data = df)

其中covars是字符串c(“ covar.1”,“ covar.2”,...)的向量。

我尝试了几件事

  cols <- colnames(df)
  covars <- cols[grep("covar", colnames(df))]
  m.out <- matchit(group ~ covars, data=df, method="nearest", distance="logit", caliper=.20)

但是得到了variable lengths differ (found for 'covars')

仅使用covars和group定义新的数据框是可行的,但是使用matchit不能达到我的目的,因为我也希望匹配的数据具有其他列,而不仅仅是我选择作为匹配对象的covars。 / p>

这似乎是一件容易的事,但是经过一番谷歌搜索后,我不知道为什么。不知道那里的R公式期望作为列的子集。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

您可能要使用as.formula
尝试这样做:

替换group ~ covars

as.formula(paste('group','~', paste(covars, collapse="+"))))

答案 1 :(得分:1)

我在您的另一个问题中提到了这一点,但是cobalt包中有一个专门为此功能的函数,即f.build()f.build()的第一个参数是一个字符串,其中包含处理变量的名称(或公式的左侧),第二个参数是一个字符串矢量,其中包含位于右侧的变量的名称公式的(即协变量)。第二个参数也可以是包含协变量的data.frame。 f.build()仅提取名称。然后,它执行所选答案中描述的操作,在其他一些方面增加了一些附加功能,使其更加通用并且对错误更可靠。

cobalt文档在f.build()上有一个section,并以glm()matchit()的使用作为示例。

运行matchit()之后,您可以使用bal.tab()中与cobalt兼容的MatchIt函数来评估协变量的平衡:

bal.tab(m.out, un = TRUE)

cobalt的{​​{3}}详细说明了MatchItinput: -76.833-106.954, -76.833--108.954 output: -76.833,106.954,-76.833,-108.954 的用法。