首页 > 解决方案 > 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

谢谢你的帮助

标签: rmatchmatching

解决方案


回答

该功能似乎无法正常工作,因此这可能是不可能的。该软件包似乎也没有得到积极维护。我的建议是转向不同的包,例如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)

如您所见,他们只是创建了一个group_id_t从 1 到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 等)时,它仅更改初始参数中的 1 个参数 ( bvec)。该参数本质上携带有关应找到多少匹配项的信息,然后将其作为约束输入到优化器中。但是,我得到的印象是bvec. 它与条件一起输入<=,这意味着优化器只需找到您获得n_controls 或更少的解决方案。我尝试更深入地研究初始参数是如何确定的,但那是几百行代码,所以我放弃了。

最后的想法

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


推荐阅读