You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:15:45