【问题标题】:Matching using a date range使用日期范围匹配
【发布时间】:2018-12-07 13:27:07
【问题描述】:

我有一张病例表和一张对照表。我想使用年龄和性别的精确匹配来创建一组匹配的控件。我还想指定控件在病例死亡日期之前至少有一年的数据 (dod)。

数据如下:

nControls <- 10e4
nCases <- 10e2
start_date <- as.Date('2011-04-01')
end_date <- as.Date('2016-04-01')

ages <- paste0(seq(0, 75, 5), '-', seq(4, 79, 5))
nAges <- length(ages)

controls <- data.frame(
  id = seq_len(nControls),
  start = sample(seq(start_date, end_date, by = 'year'), size = nControls, replace = T),
  dur = sample(1:5, nControls, replace = T) * 365.25,
  age = sample(ages, nControls, replace = T, prob = 1:nAges / sum(1:nAges)),
  sex = sample(c('m', 'f'), nControls, replace = T, prob = c(0.7, 0.3)))
controls$end <- controls$start + controls$dur

cases <- data.frame(
  id = seq_len(nCases),
  dod = sample(seq(as.Date('2011/04/01'), as.Date('2016/04/01'), by = 'day'), size = nCases, replace = T),
  age = sample(ages, nCases, replace = T),
  sex = sample(c('m', 'f'), nCases, replace = T))

只需手动或使用MatchIt 包即可轻松完成年龄和性别匹配:

controls$treat <- 0
cases$treat <- 1
mt <- rbind(controls[,c('treat', 'age', 'sex')], cases[,c('treat', 'age', 'sex')])
m.out <- matchit(treat ~ age + sex, data = mt, exact = c('age', 'sex'), method = 'nearest', ratio = 2)

但我不知道如何包含cases$dod 应该在controls$end 之前并且至少在controls$start 之后一年的条件。

【问题讨论】:

    标签: r bioinformatics


    【解决方案1】:

    不确定这是否是您所追求的(缺少所需的输出).. 但这是第一次尝试:

    下面的代码对来自案例和控件的sexage 执行data.table 左非等连接,其中start.control &lt; dod - 1 yearend.control &gt; dod

    代码

    library( data.table )
    library( lubridate )
    
    #create data.tables
    dt.controls <- as.data.table( controls )  #or use setDT()
    dt.cases <- as.data.table( cases )  #or use setDT()
    #add suffixes, to identify the columns after join
    names( dt.controls ) <- paste0( names( dt.controls ), ".control" )
    names( dt.cases ) <- paste0( names( dt.cases ), ".case" )
    #save colum order for later use
    colorder <- c( names( dt.cases), names( dt.controls ) )
    #set join columns
    dt.controls[, `:=`( age.join = age.control, 
                        sex.join = sex.control, 
                        start.join = start.control, 
                        end.join = end.control)]
    
    dt.cases[, `:=`( age.join = age.case, 
                     sex.join = sex.case, 
                     dod.join.start = dod.case %m-% lubridate::years( 1 ),  #!! %m-%
                     dod.join.end = dod.case )]  
    #perform non-equi join
    result <- dt.controls[ dt.cases, on = .( age.join , 
                                             sex.join, 
                                             start.join < dod.join.start, 
                                             end.join > dod.join.end ), 
                           mult = "first", 
                           nomatch = NA ]
    #drop the *.join columns
    result[, grep( ".join$", names( result ) ) := NULL]
    #set column order so cases come first, controls after
    setcolorder( result, colorder )
    

    输出

    head(result)
    #    id.case   dod.case age.case sex.case id.control start.control dur.control age.control sex.control end.control
    # 1:       1 2012-12-26      5-9        m        318    2011-04-01     1826.25         5-9           m  2016-03-31
    # 2:       2 2015-09-19    75-79        f         26    2012-04-01     1461.00       75-79           f  2016-04-01
    # 3:       3 2011-08-17    25-29        m         NA          <NA>          NA        <NA>        <NA>        <NA>
    # 4:       4 2011-07-23    35-39        f         NA          <NA>          NA        <NA>        <NA>        <NA>
    # 5:       5 2013-11-16    30-34        f        112    2012-04-01      730.50       30-34           f  2014-04-01
    # 6:       6 2014-09-17      5-9        f        784    2013-04-01     1826.25         5-9           f  2018-04-01
    

    您可以使用 nomatchmult 连接参数来“调整”输出...

    【讨论】:

    • 非常感谢 - 我仍在努力解决这个问题,但我想它可以 1:1 匹配案例与控件?
    • 是的,确实如此。如果您想要一对多匹配,请设置 mult=“all”。
    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 2019-07-02
    • 2017-10-12
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多