R语言:为观测日期匹配三类对照组日期的实现方法
特殊日期与非特殊日差异分析:三类对照组构建方案
先修正初始代码的错误(原代码中sample(dates, ...)的dates应为all_dates),并统一生成非特殊日期池:
Start <- as.Date("2016-01-01") End <- as.Date("2017-12-31") all_dates <- seq(from = Start, to = End, by = 1) set.seed(1) sam1 <- sample(all_dates, 30) sam2 <- sample(all_dates, 5) sam3 <- sample(all_dates, 120) # 合并所有特殊日期,生成非特殊日期池 special_dates <- c(sam1, sam2, sam3) non_special_dates <- all_dates[!all_dates %in% special_dates]
1. 对应数量的最近日期对照组
针对每个特殊日期,找到非特殊日期中距离最近的日期,去重后匹配样本数量:
get_nearest_control <- function(sample_dates, non_special_pool) { control_dates <- c() for (d in sample_dates) { # 计算日期距离,筛选最近的非特殊日期 dists <- abs(as.numeric(d - non_special_pool)) nearest <- non_special_pool[which.min(dists)] control_dates <- c(control_dates, nearest) # 移除已选日期,避免重复匹配 non_special_pool <- non_special_pool[non_special_pool != nearest] } return(control_dates) } # 生成各样本的对照组 control1_sam1 <- get_nearest_control(sam1, non_special_dates) control1_sam2 <- get_nearest_control(sam2, non_special_dates) control1_sam3 <- get_nearest_control(sam3, non_special_dates)
2. 同期(同月/前后1个月)随机非邻近日期对照组
划定特殊日期的当月±1个月范围,筛选非特殊且与特殊日期间隔≥1天的日期,随机抽取对应数量:
get_periodic_nonadjacent_control <- function(sample_dates, non_special_pool, adj_gap = 1) { control_dates <- c() for (d in sample_dates) { # 计算同期范围(限制在总周期内) month_start <- as.Date(paste0(format(d, "%Y-%m"), "-01")) period_start <- max(month_start - months(1), Start) period_end <- min(month_start + months(2) - days(1), End) # 筛选同期内非特殊、非邻近的候选日期 candidates <- non_special_pool[non_special_pool >= period_start & non_special_pool <= period_end & abs(as.numeric(d - non_special_pool)) >= adj_gap] # 候选集为空时,放宽至仅排除特殊日期本身 if (length(candidates) == 0) { candidates <- non_special_pool[non_special_pool >= period_start & non_special_pool <= period_end] } selected <- sample(candidates, 1) control_dates <- c(control_dates, selected) non_special_pool <- non_special_pool[non_special_pool != selected] } return(control_dates) } # 生成各样本的对照组 control2_sam1 <- get_periodic_nonadjacent_control(sam1, non_special_dates) control2_sam2 <- get_periodic_nonadjacent_control(sam2, non_special_dates) control2_sam3 <- get_periodic_nonadjacent_control(sam3, non_special_dates)
3. 任意非特殊日期对照组
直接从非特殊日期池中随机抽取对应数量的日期:
control3_sam1 <- sample(non_special_dates, length(sam1)) control3_sam2 <- sample(non_special_dates, length(sam2)) control3_sam3 <- sample(non_special_dates, length(sam3))
内容的提问来源于stack exchange,提问作者Essi
相关产品推荐
相关产品推荐

