0

所以我的情况如下:我有一个大数据框,其中包含我应该在匹配分析中使用的数据。但是,我应该匹配由某些区域定义的子组内部。因为我不想为每个子组(太多)“手动”执行此操作,所以我想出了一种方法,将初始数据帧划分为包含每个独特处理区域和控制区域信息的子数据帧,并且将这些数据帧保存到列表中。在此之后,我使用 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) . 有什么建议么?

很抱歉我没有提供任何数据。生成一个真实的数据集会很复杂,我不能分享原始数据。如果绝对有必要,我可以尝试提出某种虚拟数据集。

4

1 回答 1

1

请参阅这个问题,它提出了同样的问题,以及文档match.data()它回答了这个问题(参见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,则 usingexact将在精确匹配变量的子组内自动匹配(即,它将在每个变量内执行单独的匹配过程)method = "nearest"。设置verbose = TRUE将显示当前正在匹配的级别。您还可以使用新rbind()方法将匹配的数据集组合在一起(在旧版本中,您将使用 来创建统计错误rbind())。

于 2021-06-02T16:47:47.337 回答