微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

designmatch 包输出 1:2 匹配

如何解决designmatch 包输出 1:2 匹配

我正在尝试使用 designmatch 包将已处理组 (n=88) 与两个未处理控件进行基数匹配。输出返回 88x3=264 group_id 和 88 t_id,但只有 88 c_id(而不是 88x2=176)。我知道 designmatch 认不使用替换,所以我不明白为什么我只得到 88 c_id。

out <- bmatch(t_ind = t_ind,near_exact =  near_exact,n_controls=2)

out

$obj_total
[1] -88

$obj_dist_mat
NULL

$t_id
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
[44] 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
[87] 87 88

$c_id
 [1] 108 308 279 131 220 147 231 437 194 278 153 445 383 290 482 105 241 335 238 202 289 301 323 312 159 262 176 315 443 200 377 393
[33] 885 581 927 398 217 117 240 448 263 554 525 854 169 352 317 119 386 414 518 477 424 469 280 286 297 513 316  97 936 609 387 455
[65] 168 702 284 432 349 379 446 543 552 293 851 185 713 501 232 641 997 561 499 310 485 466 675 647

$group_id
  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
 [44] 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
 [87] 87 88  1  1  2  2  3  3  4  4  5  5  6  6  7  7  8  8  9  9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21
[130] 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42
[173] 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64
[216] 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77 78 78 79 79 80 80 81 81 82 82 83 83 84 84 85 85
[259] 86 86 87 87 88 88

感谢您的帮助

解决方法

回答

该功能似乎无法正常工作,因此这可能是不可能的。该软件包似乎也没有得到积极维护。我的建议是转向一个不同的包,比如 MatchIt

详情

我广泛地查看了包的源代码。我做了几个观察。

  1. 输出中的 group_id 元素似乎没有任何依据。

在输出中,您确实看到 group_id 似乎具有正确的尺寸。但是,这些数字似乎没有任何意义:

group_id_t = 1:(length(t_id))
group_id_c = sort(rep(1:(length(t_id)),n_controls))
group_id = c(group_id_t,group_id_c)

如您所见,他们只是创建了一个从 1 到 group_id_t 的向量 length(t_id)(处理组的 ID,请参见输出中的 t_id)。接下来,他们创建了一个完全相同的向量 group_id_c,只是重复了 n_controls 次。最后的 group_id 只是它的连接版本。

我环顾四周,寻找可以输入此值的矩阵,或者行/列数与 group_id 的长度相匹配的矩阵。我找不到一个。 group_id 中的数字似乎没有价值。

  1. 优化器似乎优化了 n_controls 或更少

bmatch 函数有几个步骤。首先,它计算一些初始参数。其次,它将这些参数放在优化器中(在默认情况下:glpk 使用 Rglpk::Rglpk_solve_LP)。第三,它进行一些计算以创建输出。

当您改变 n_controls(1、2、10 等)时,它只会改变初始参数 (bvec) 中的 1 个参数。该参数主要携带有关应找到多少匹配项的信息,然后作为约束输入优化器。但是,我觉得 bvec 有问题。它使用条件 <= 输入,这意味着优化器只需找到一个解决方案,您可以得到 n_controls 或更少。我试着更深入地研究初始参数是如何确定的,但那是几百行代码,所以我放弃了。

最后的想法

该软件包的最后更新时间为 2018-06-18,这表明作者已经有一段时间没有查看它了。你可以/应该联系他们,看看他们怎么说。或者,还有其他包,如 MatchIt 已经过广泛验证。您也可以改用这些软件包之一。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。