designmatch 包输出 1:2 匹配

designmatch package output in 1:2 matching

我正在尝试使用 designmatch 包将处理组 (n=88) 的基数匹配到两个未处理的控件。输出returns88x3=264group_id和88t_id,但只有88c_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 到 length(t_id) 的向量 group_id_t(处理组的 ID,请参阅输出中的 t_id)。接下来,他们创建了一个完全相同的向量 group_id_c,只是重复了 n_controls 次。最后的 group_id 只是它的串联版本。

我四处寻找可以输入此内容的矩阵,或者 rows/columns 的数量与 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,这表明作者已经有一段时间没有看过它了。您 can/should 联系他们,看看他们怎么说。或者,还有其他包,如 MatchIt 已经过广泛验证。您也可以改用其中一个软件包。