我正在尝试在协变量的子集上使用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公式期望作为列的子集。任何帮助表示赞赏。
答案 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}}详细说明了MatchIt
与input: -76.833-106.954, -76.833--108.954
output: -76.833,106.954,-76.833,-108.954
的用法。