病例对照研究 "exact" 与重叠时间间隔匹配
Case-control study "exact" match with overlapping time intervals
我想在考虑时间间隔的情况下进行病例对照匹配。
如果对照观察对于独立变量 X1、X2 和重叠时间间隔 X3 具有相同的值,我想要一个匹配项。
例如,假设以下 df1:
row Y X1 X2 X3
1 0 1 1 2017-01-06 UTC--2017-01-10 UTC
2 0 1 1 2017-01-07 UTC--2017-01-11 UTC
3 0 1 1 2017-01-08 UTC--2017-01-12 UTC
4 0 1 1 2017-01-09 UTC--2017-01-13 UTC
5 0 1 1 2017-01-10 UTC--2017-01-14 UTC
6 1 1 1 2017-01-11 UTC--2017-01-15 UTC
7 0 1 1 2017-01-12 UTC--2017-01-16 UTC
8 0 1 1 2017-01-13 UTC--2017-01-17 UTC
9 0 1 1 2017-01-14 UTC--2017-01-18 UTC
10 0 1 1 2017-01-15 UTC--2017-01-19 UTC
11 0 1 1 2017-01-16 UTC--2017-01-20 UTC
使用以下代码创建:
library(lubridate)
library(MatchIt)
df1 <- data.frame(Y=c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0),
X1=rep(1, 11),
X2=rep(1,11),
X3=c(interval(ymd(20170106), ymd(20170110)),
interval(ymd(20170107), ymd(20170111)),
interval(ymd(20170108), ymd(20170112)),
interval(ymd(20170109), ymd(20170113)),
interval(ymd(20170110), ymd(20170114)),
interval(ymd(20170111), ymd(20170115)),
interval(ymd(20170112), ymd(20170116)),
interval(ymd(20170113), ymd(20170117)),
interval(ymd(20170114), ymd(20170118)),
interval(ymd(20170115), ymd(20170119)),
interval(ymd(20170116), ymd(20170120))))
matchit(Y ~ X1 + X2 + X3, data=df1, method="exact")
输出:
summary(matchit(Y ~ X1 + X2 + X3, data=df1, method="exact"))
Sample sizes:
Control Treated
All 10 1
Matched 10 1
Unmatched 0 0
match.data(matchit(Y ~ X1 + X2 + X3, data=df1, method="exact"))
row Y X1 X2 X3 weights subclass
1 0 1 1 2017-01-06 UTC--2017-01-10 UTC 1 1
2 0 1 1 2017-01-07 UTC--2017-01-11 UTC 1 1
3 0 1 1 2017-01-08 UTC--2017-01-12 UTC 1 1
4 0 1 1 2017-01-09 UTC--2017-01-13 UTC 1 1
5 0 1 1 2017-01-10 UTC--2017-01-14 UTC 1 1
6 1 1 1 2017-01-11 UTC--2017-01-15 UTC 1 1
7 0 1 1 2017-01-12 UTC--2017-01-16 UTC 1 1
8 0 1 1 2017-01-13 UTC--2017-01-17 UTC 1 1
9 0 1 1 2017-01-14 UTC--2017-01-18 UTC 1 1
10 0 1 1 2017-01-15 UTC--2017-01-19 UTC 1 1
11 0 1 1 2017-01-16 UTC--2017-01-20 UTC 1 1
我想要 6(案例)和 2,3,4,5,7,8,9,10(对照)之间的匹配项,如果任何对照时间间隔介于 2017 年 1 月 11 日和2017 年 1 月 15 日我想要与该控件匹配
您可以体会到有 1:10 匹配而不是 1:8 匹配
编辑:我更改了之前的 df 示例:https://pastebin.com/nwzpyUAr
EDIT2:会话信息:https://pastebin.com/g2Q1t1E0
我得出的结论是我可以匹配除 X3(时间间隔)以外的所有变量,然后我们可以 select 案例 time_Interval 并使用 int_overlaps 函数来自 lubridate 包
result <- match.data(matchit(Y ~ X1 + X2, data=df1, method="exact"))
case_timeInterval <- result[result$Y == 1,]$X3
result <- result %>%
filter(ifelse(int_overlaps(X3, case_timeInterval), 1, 0) == 1)
我想在考虑时间间隔的情况下进行病例对照匹配。 如果对照观察对于独立变量 X1、X2 和重叠时间间隔 X3 具有相同的值,我想要一个匹配项。
例如,假设以下 df1:
row Y X1 X2 X3
1 0 1 1 2017-01-06 UTC--2017-01-10 UTC
2 0 1 1 2017-01-07 UTC--2017-01-11 UTC
3 0 1 1 2017-01-08 UTC--2017-01-12 UTC
4 0 1 1 2017-01-09 UTC--2017-01-13 UTC
5 0 1 1 2017-01-10 UTC--2017-01-14 UTC
6 1 1 1 2017-01-11 UTC--2017-01-15 UTC
7 0 1 1 2017-01-12 UTC--2017-01-16 UTC
8 0 1 1 2017-01-13 UTC--2017-01-17 UTC
9 0 1 1 2017-01-14 UTC--2017-01-18 UTC
10 0 1 1 2017-01-15 UTC--2017-01-19 UTC
11 0 1 1 2017-01-16 UTC--2017-01-20 UTC
使用以下代码创建:
library(lubridate)
library(MatchIt)
df1 <- data.frame(Y=c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0),
X1=rep(1, 11),
X2=rep(1,11),
X3=c(interval(ymd(20170106), ymd(20170110)),
interval(ymd(20170107), ymd(20170111)),
interval(ymd(20170108), ymd(20170112)),
interval(ymd(20170109), ymd(20170113)),
interval(ymd(20170110), ymd(20170114)),
interval(ymd(20170111), ymd(20170115)),
interval(ymd(20170112), ymd(20170116)),
interval(ymd(20170113), ymd(20170117)),
interval(ymd(20170114), ymd(20170118)),
interval(ymd(20170115), ymd(20170119)),
interval(ymd(20170116), ymd(20170120))))
matchit(Y ~ X1 + X2 + X3, data=df1, method="exact")
输出:
summary(matchit(Y ~ X1 + X2 + X3, data=df1, method="exact"))
Sample sizes:
Control Treated
All 10 1
Matched 10 1
Unmatched 0 0
match.data(matchit(Y ~ X1 + X2 + X3, data=df1, method="exact"))
row Y X1 X2 X3 weights subclass
1 0 1 1 2017-01-06 UTC--2017-01-10 UTC 1 1
2 0 1 1 2017-01-07 UTC--2017-01-11 UTC 1 1
3 0 1 1 2017-01-08 UTC--2017-01-12 UTC 1 1
4 0 1 1 2017-01-09 UTC--2017-01-13 UTC 1 1
5 0 1 1 2017-01-10 UTC--2017-01-14 UTC 1 1
6 1 1 1 2017-01-11 UTC--2017-01-15 UTC 1 1
7 0 1 1 2017-01-12 UTC--2017-01-16 UTC 1 1
8 0 1 1 2017-01-13 UTC--2017-01-17 UTC 1 1
9 0 1 1 2017-01-14 UTC--2017-01-18 UTC 1 1
10 0 1 1 2017-01-15 UTC--2017-01-19 UTC 1 1
11 0 1 1 2017-01-16 UTC--2017-01-20 UTC 1 1
我想要 6(案例)和 2,3,4,5,7,8,9,10(对照)之间的匹配项,如果任何对照时间间隔介于 2017 年 1 月 11 日和2017 年 1 月 15 日我想要与该控件匹配
您可以体会到有 1:10 匹配而不是 1:8 匹配
编辑:我更改了之前的 df 示例:https://pastebin.com/nwzpyUAr
EDIT2:会话信息:https://pastebin.com/g2Q1t1E0
我得出的结论是我可以匹配除 X3(时间间隔)以外的所有变量,然后我们可以 select 案例 time_Interval 并使用 int_overlaps 函数来自 lubridate 包
result <- match.data(matchit(Y ~ X1 + X2, data=df1, method="exact"))
case_timeInterval <- result[result$Y == 1,]$X3
result <- result %>%
filter(ifelse(int_overlaps(X3, case_timeInterval), 1, 0) == 1)