我想用两个条件为每个case
匹配2个controls
:
age
差值应在± 2之间;income
差值应在± 2之间。
如果一个案例超过2个controls
,我只需要随机选择2个controls
即可,举个例子:
示例
数据
dat = structure(list(id = c(1, 2, 3, 4, 111, 222, 333, 444, 555, 666,
777, 888, 999, 1000),
age = c(10, 20, 44, 11, 12, 11, 8, 12, 11, 22, 21, 18, 21, 18),
income = c(35, 72, 11, 35, 37, 36, 33, 70, 34, 74, 70, 44, 76, 70),
group = c("case", "case", "case", "case", "control", "control",
"control", "control", "control", "control", "control",
"control", "control", "control")),
row.names = c(NA, -14L), class = c("tbl_df", "tbl", "data.frame"))
> dat
# A tibble: 14 x 4
id age income group
<dbl> <dbl> <dbl> <chr>
1 1 10 35 case
2 2 20 72 case
3 3 44 11 case
4 4 11 35 case
5 111 12 37 control
6 222 11 36 control
7 333 8 33 control
8 444 12 70 control
9 555 11 34 control
10 666 22 74 control
11 777 21 70 control
12 888 18 44 control
13 999 21 76 control
14 1000 18 70 control
预期结局
对于id = 1
,匹配的控件如下所示,我只需要在下表中随机选择2个controls
。
| 身份证|年龄|收入|群|
| - ------|- ------|- ------|- ------|
| 一百一十一|十二|三十七|控制|
| 二百二十二|十一|三十六|控制|
| 三百三十三|八个|三十三|控制|
| 五百五十五|十一|三十四|控制|
对于id = 2
,匹配的控件如下所示,我只需要在下表中随机选择2个controls
。
| 身份证|年龄|收入|群|
| - ------|- ------|- ------|- ------|
| 六六六|二十二|七十四|控制|
| 七七七|二十一|七十|控制|
| 一千|十八|七十|控制|
对于id = 3
,在dat
中没有匹配的controls
。
对于id = 4
,匹配的控件如下所示,我只需要在下表中随机选择2个controls
。
这里需要注意的是,我们可以发现id = 1
和id = 4
的控件有重叠的部分,我不希望两个cases
共享一个control
,我需要的是如果id = 1
选择id = 111
和id = 222
作为control
,那么id = 4
只能选择id = 555
作为control
,并且如果id = 1
选择id = 111
和id = 333
作为对照,那么id = 4
只能选择id = 222
和id = 555
作为对照。
| 身份证|年龄|收入|群|
| - ------|- ------|- ------|- ------|
| 一百一十一|十二|三十七|控制|
| 二百二十二|十一|三十六|控制|
| 五百五十五|十一|三十四|控制|
最终的输出可能是这样的(control
组中的id
是从满足条件的id
中随机选择的):
| 身份证|年龄|收入|群|
| - ------|- ------|- ------|- ------|
| 1个|十个|三十五|箱|
| 第二章|二十个|七十二|箱|
| 三个|四十四|十一|箱|
| 四个|十一|三十五|箱|
| 一百一十一|十二|三十七|控制|
| 二百二十二|十一|三十六|控制|
| 三百三十三|八个|三十三|控制|
| 五百五十五|十一|三十四|控制|
| 七七七|二十一|七十|控制|
| 一千|十八|七十|控制|
注解
我查过一些网站,但是它们不符合我的需求。我不知道如何用R代码实现我的需求。
任何帮助将不胜感激!
参考:
1.https://stackoverflow.com/questions/56026700/is-there-any-package-for-case-control-matching-individual-1n-matching-in-r-n
2. Case control matching in R (or spss), based on age, sex and ethnicity?
3. Matching case-controls in R using the ccoptimalmatch package
4. Exact Matching in R
3条答案
按热度按时间gz5pxeao1#
根据修改后的要求,我建议使用以下
for loop
检查不同种子的结果
dat
已修改,然后才能继续处理id 3case
和control
list2env
将两个保存为单独的dfspurrr::map_df
,您可以为每种情况取两行样本age
income
bind_rows
同样,这些与case
也下面的代码也可以做同样的事情而不保存单独的dfs
xqkwcwgp2#
在不同的 Dataframe 中分离case和control。对于
case_data
中的每一行,在control_data
中找到匹配的行,并从中随机选择2行。使用
map_df
,我们可以将所有内容合并到一个 Dataframe 中。ogsagwnx3#
我把
map2
函数放在大括号里,这样我就可以选择我想用什么变量来表示.x
和.y
,否则%>%
会把整个数据集替换为第一个参数: