如何解决MatchIt 与 lapply() 相结合:eval(object$call$data,envir = env) 中的错误:找不到对象“x”
所以我的情况如下:我有一个大数据框,其中包含我应该在匹配分析中使用的数据。但是,我应该匹配由某些区域定义的子组内部。因为我不想为每个子组(有太多)“手动”这样做,所以我想出了一种方法,将初始数据帧划分为包含每个唯一处理区域和控制区域信息的子数据帧,以及将这些数据帧保存到列表中。在此之后,我使用 R 的 MatchIt 包中的 matchit 函数对列表中的数据帧进行匹配。这是一个高度简化的数据框列表示例:
> list_df
$A
name treatment cov1 cov2 cov3 var
1 A 1 13.65933 200.5809 13 1000.1185
2 A 1 15.80334 233.8301 13 1010.1038
3 A 1 15.16098 215.1046 13 999.8548
4 A 1 16.45487 185.4957 13 997.5585
5 A 1 15.55230 193.5955 13 1001.2822
9 U 0 16.33895 175.6502 13 999.0682
10 U 0 18.05787 197.6041 13 1003.2781
11 U 0 14.29088 229.5446 13 1002.9567
12 U 0 16.32195 238.9975 13 998.9453
13 U 0 15.25240 217.5467 13 1004.0581
14 U 0 14.69154 219.9963 13 999.3270
15 U 0 14.88606 153.6038 15 989.6423
16 U 0 14.34472 212.5205 15 994.6094
17 U 0 14.66233 231.1179 15 999.7775
18 U 0 14.69155 240.4084 15 994.9280
19 U 0 15.63663 198.3323 10 1007.4225
20 U 0 15.19980 183.5846 10 997.6229
$B
name treatment cov1 cov2 cov3 var
6 B 1 15.66004 187.1542 15 1004.2311
7 B 1 13.89696 197.5548 15 995.6478
8 B 1 16.17403 204.9423 15 1001.5157
9 U 0 16.33895 175.6502 13 999.0682
10 U 0 18.05787 197.6041 13 1003.2781
11 U 0 14.29088 229.5446 13 1002.9567
12 U 0 16.32195 238.9975 13 998.9453
13 U 0 15.25240 217.5467 13 1004.0581
14 U 0 14.69154 219.9963 13 999.3270
15 U 0 14.88606 153.6038 15 989.6423
16 U 0 14.34472 212.5205 15 994.6094
17 U 0 14.66233 231.1179 15 999.7775
18 U 0 14.69155 240.4084 15 994.9280
19 U 0 15.63663 198.3323 10 1007.4225
20 U 0 15.19980 183.5846 10 997.6229
这里是匹配组合matchit(与马哈拉诺比斯距离)和lapply的代码:
library(MatchIt)
m_obj_Mah <- lapply(area_list,function(x){
matchit(Treatment ~ Cov1 + Cov2 + Cov3 + Cov4 + Cov5,data=x,method="nearest",exact = ~ Cov6 + Cov7,distance="mahalanobis")
}
)
在上面的代码中,一切正常。但是,当我尝试提取匹配的数据集时,出现错误:
m_data_Mah <- lapply(m_obj_Mah,function(x) {match.data(x)})
eval(object$call$data,envir = env) 中的错误:找不到对象“x”
这里最奇怪的是,我使用相同的方法在同一数据集中用卡尺进行最近邻倾向得分匹配,但没有出现错误。该错误显然与使用 x 作为 lapply 中每个 df 的名称定义函数有关,但我无法提出解决方案(以另一种方式遍历区域或以某种方式定义 lapply 中的 x) .有什么建议吗?
很抱歉我没有提供任何数据。生成真实的数据集会非常复杂,我无法分享原始数据。如果绝对有必要,我可以尝试提出某种虚拟数据集。
解决方法
请参阅这个 issue,它提出了相同的问题,以及 match.data()
的 documentation,它回答了这个问题(参见 data
参数)。
这是 match.data()
的固有限制,但解决方案很简单且有文档记录:将原始数据集提供给 data
的 match.data()
参数,如下所示:
m_data_Mah <- lapply(seq_along(area_list),function(i) {
match.data(m_obj_Mah[[i]],data = area_list[[i]])}
如果您使用的是 4.2.0 或更高版本的 MatchIt
,使用 exact
将在精确匹配变量的子组内自动匹配(即,它将在每个子组中执行单独的匹配程序)使用 method = "nearest"
。设置 verbose = TRUE
将显示当前正在匹配的级别。您还可以使用新的 rbind()
方法将匹配的数据集组合在一起(在旧版本中,您将使用 rbind()
产生统计错误)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。