本教程把流行病学研究设计看作一条完整的决策链,而不是一张研究类型名词表:
要支持什么决策? 目标人群与目标效应是什么? 需要怎样的比较? 怎样获得具有信息量且合乎伦理的样本? 如何测量、分析和报告?
完成学习后,你应当能够:
所有 R 代码均可依次运行,不需要额外分析包。公式给出的是教学用起点;涉及复杂抽样、生存结局、重复测量、多重终点、自适应设计或监管决策时,应由抽样/生物统计专家复核,并用模拟评估操作特征。
本教程不替代研究伦理委员会(IRB/REB)、隐私办公室、原住民或社区数据治理要求、临床试验监管规范及当地法律。只有在适用的伦理与监管批准、有效知情同意或获准的同意豁免,以及相应法律授权允许的范围内,才能接触、链接或二次使用个体健康数据。
设计的目的不是给数据贴标签,而是让所得证据能支持预先说明的决策。例如:
“比较 A 与 B 是否有差异”仍不够精确。研究者要说明人群、处理/暴露策略、结局、时间、汇总指标与如何处理干预后事件。
| 元素 | 要回答的问题 | 示例:疫苗提醒试验 |
|---|---|---|
| P(Population) | 结论适用于谁? | 尚未完成两剂疫苗的 18–64 岁门诊患者 |
| E/I(Exposure/Intervention) | 比较的暴露或策略是什么? | 每周一次、共四周的短信提醒 |
| C(Comparator) | 与什么比较? | 常规通知 |
| O(Outcome) | 结局怎样定义和测量? | 随机后 90 天内完成第二剂 |
| T(Time) | 起点、随访窗和宽限期? | 随机日起 90 天 |
Estimand(目标效应)至少要明确:
例如,意向治疗效应(ITT)比较“被随机分配到两种策略”的结果,不因依从性改变分组;符合方案效应则试图比较遵循策略时的结果,通常需要更强假设和专门方法。
设计可从多个相互独立的维度描述。不要只说“回顾性研究”,而应说清楚抽样依据、时间方向、比较方式、数据来源和分析单位。
| 维度 | 常见选项 | 为什么重要 |
|---|---|---|
| 研究者是否分配暴露 | 观察性 / 实验性 | 决定因果解释、伦理和执行要求 |
| 主要抽样依据 | 按人群 / 按暴露 / 按结局 | 区分队列与病例对照的核心 |
| 时间结构 | 单一时点 / 纵向 / 重复横断面 | 决定时序、发病率与趋势能否估计 |
| 数据获取方向 | 前瞻 / 回顾 / 双向 | 影响测量控制、成本与缺失;不是设计本身 |
| 分配单位 | 个体 / 家庭 / 诊所 / 社区 | 决定聚类、污染和有效样本量 |
| 分析单位 | 个体 / 群体 / 事件 / 地区-时期 | 决定可做的推断以及生态谬误风险 |
| 研究目的 | 描述 / 病因 / 预测 / 诊断 / 评价 | 决定目标指标和验证策略 |
从处于结局风险中的人群开始,按暴露或其他特征比较未来结局。可估计风险、率、风险差、风险比及时间至事件。
优势是时序清楚、可研究多个结局;局限是罕见结局需要很大样本,长期研究易失访,暴露与混杂会随时间变化。
先从同一来源人群识别病例,再抽取代表病例发生时该来源人群暴露分布的对照,回看既往暴露。特别适合罕见结局或长潜伏期。
关键不是“病例有病、对照没病”,而是:如果某位对照在研究期间成为病例,他/她应有资格进入病例组。 对照应按来源人群抽取机制选择,而不是单纯找“健康人”。
匹配用于提高效率或控制强混杂,但匹配变量必须在分析中正确处理;对潜在中介或与暴露高度相关但非混杂的变量过度匹配,可能降低效率或引入选择问题。
当随机化不可行时,设计本身仍可创建更可信的反事实比较:
简单的“干预前一个点 vs 后一个点”很难区分政策效应、自然趋势、回归均值与同期变化,通常不应被称为有说服力的准实验。
| 类型 | 主要问题 | 核心设计要点 |
|---|---|---|
| 诊断准确性研究 | 指标检测能否识别目标状态? | 连续/代表性疑似人群、独立盲法判读、所有人接受适当参照标准 |
| 预后研究 | 某起点后发生什么? | 明确共同时间零点、完整随访、校准与区分度、外部验证 |
| 预测模型研究 | 能否预测个体未来风险? | 区分开发与验证;避免按“每变量 10 事件”机械规划;评估过拟合 |
| 监测研究 | 人群事件随时间怎样变化? | 稳定病例定义、报告完整性、时效性、分母和系统变更 |
| 暴发调查 | 病因与控制措施是什么? | 病例定义、主动搜索、描述流行曲线、假设检验与即时控制并行 |
| 定性研究 | 人们如何理解、经历或实施? | 有目的抽样、信息充分性、反思性、可信度与情境描述 |
| 混合方法 | 数量与机制如何结合? | 预先说明顺序、权重和整合点,而非简单并列两类数据 |
| 系统综述/荟萃分析 | 全部相关证据总体说明什么? | 预注册问题、完整检索、双人筛选、偏倚评估、异质性和发表偏倚 |
| 常规数据/EHR 研究 | 既有数据能回答什么? | 数据生成机制、编码变化、可观测性、链接误差与可迁移性 |
| 研究条件 | 通常优先考虑 | 不足与补救 |
|---|---|---|
| 估计某时点患病率 | 概率抽样横断面调查 | 非应答、覆盖误差;用追访、权重与敏感性分析 |
| 罕见结局、长潜伏期 | 病例对照 | 对照选择、回忆偏倚;使用登记病例与客观既往记录 |
| 罕见暴露、多个结局 | 队列 | 结局数可能不足;扩大人时或链接登记系统 |
| 干预可分配且存在不确定性 | RCT | 成本、依从和推广性;采用实用性流程与代表性场点 |
| 群体政策在明确时间实施 | 有对照 ITS / DiD | 同期事件、趋势假设;增加对照系列和安慰剂分析 |
| 诊断工具评价 | 横断式诊断准确性队列 | 谱偏倚、验证偏倚;连续入组并统一参照标准 |
| 快速发现新信号 | 病例系列/监测 | 缺少对照;明确仅用于信号生成并启动分析研究 |
| 机制与实施情境 | 定性或混合方法 | 转移性依赖情境;透明说明抽样、反思性和整合逻辑 |
例:目标是某省全部成年居民,来源人群可能是有省级医保登记且过去一年居住者,抽样框是去重后的登记名单,抽中样本是随机选出的登记者,入组人群是确认资格并同意问卷者,分析样本是按方案取得有效血压测量者。把这些集合分开,才能分别计算覆盖、联系、应答、留存和进入分析的比例;每一步都可能造成覆盖、选择或缺失偏倚。
概率抽样要求每个抽样单位有已知且大于零的入样概率 。基础权重为 。概率机制支持设计型总体推断,但仍会受框覆盖、非应答和测量误差影响。
从 个单位无放回等概率抽 个,每人的 ,权重 。适合完整且规模可管理的抽样框。
set.seed(1001)
frame <- data.frame(
id = sprintf("P%04d", 1:1200),
region = sample(c("北", "中", "南"), 1200, replace = TRUE,
prob = c(0.25, 0.45, 0.30)),
age = sample(18:85, 1200, replace = TRUE)
)
srs_index <- sample.int(nrow(frame), size = 120, replace = FALSE)
srs <- frame[srs_index, ]
srs$inclusion_probability <- 120 / 1200
srs$base_weight <- 1 / srs$inclusion_probability
head(srs)##
## 中 北 南
## 55 27 38
使用稳定的 ID 保存抽样结果,不要只保存行号;抽样框排序或更新后,行号可能指向不同的人。
随机选择起点后,每隔 个单位抽一个。执行简单并能在有序名单上分散样本,但若名单存在与间隔同步的周期结构会偏倚。必须随机起点,不能总从第一条开始。
set.seed(1002)
N <- 1200
n <- 120
interval <- N / n
random_start <- sample(seq_len(interval), size = 1)
systematic_index <- seq(from = random_start, by = interval, length.out = n)
systematic_sample <- frame[systematic_index, ]
c(random_start = random_start, interval = interval,
selected = nrow(systematic_sample))## random_start interval selected
## 9 10 120
若 不是整数,应使用分数间隔或适当的系统 PPS 算法,不能简单四舍五入后假装等概率。
先按地区、年龄或风险层分组,再在每层独立抽样。分层能确保小但重要群体有样本,并在层内同质时提高精度。
set.seed(1003)
# 演示对较小的“北”层过度抽样。
allocation <- c("北" = 60, "中" = 60, "南" = 60)
frame_by_region <- split(frame, frame$region)
stratified_parts <- lapply(names(allocation), function(h) {
population_h <- frame_by_region[[h]]
chosen <- sample.int(nrow(population_h), allocation[[h]], replace = FALSE)
out <- population_h[chosen, ]
out$N_h <- nrow(population_h)
out$n_h <- allocation[[h]]
out$base_weight <- out$N_h / out$n_h
out
})
stratified_sample <- do.call(rbind, stratified_parts)
row.names(stratified_sample) <- NULL
with(stratified_sample,
unique(data.frame(region, N_h, n_h, base_weight)))整群抽样先抽学校、社区、家庭或诊所,再纳入群内全部或部分个体。它降低旅行和建框成本,但同群个体相似会降低有效样本量。
多阶段例子:按省分层 以人口规模概率抽社区 每社区系统抽家庭 每户随机抽一名成年人。每阶段概率相乘:
以规模成比例概率(PPS)抽取初级单位可减少大小不等群造成的权重变异,但无放回 PPS 的精确入样概率和方差估计应使用专门抽样软件。
set.seed(1004)
clinic_sizes <- sample(45:140, 24, replace = TRUE)
clinic_frame <- data.frame(
clinic = sprintf("C%02d", 1:24),
eligible_patients = clinic_sizes
)
# 等概率抽 6 家诊所,再在每家简单随机抽最多 20 人。
selected_clinics <- clinic_frame[
sample.int(nrow(clinic_frame), 6, replace = FALSE),
]
selected_clinics$within_clinic_n <- pmin(20, selected_clinics$eligible_patients)
selected_clinics$pi_clinic <- 6 / 24
selected_clinics$pi_person_given_clinic <-
selected_clinics$within_clinic_n / selected_clinics$eligible_patients
selected_clinics$overall_pi <-
selected_clinics$pi_clinic * selected_clinics$pi_person_given_clinic
selected_clinics$base_weight <- 1 / selected_clinics$overall_pi
selected_clinics非概率样本中个体入样概率未知,传统抽样误差和总体推广不能仅靠大样本保证。它仍可用于可行性、机制探索、难接触人群、定性研究或内部比较,但必须透明说明限制。
| 方法 | 做法 | 适用情形 | 主要风险 |
|---|---|---|---|
| 便利抽样 | 招募容易接触者 | 试点、流程测试 | 严重自选与覆盖偏倚 |
| 连续入组 | 一段时间纳入所有符合者 | 临床诊断/预后研究 | 机构与就诊选择;需记录漏纳 |
| 配额抽样 | 按已知特征填满配额 | 快速市场/意见调查 | 配额内仍非随机,未测因素不平衡 |
| 有目的抽样 | 选取信息丰富、最大差异或关键案例 | 定性研究、实施研究 | 不以统计代表性为目标 |
| 滚雪球抽样 | 参与者推荐参与者 | 隐匿或难接触人群 | 网络同质性、种子依赖 |
| 受访者驱动抽样(RDS) | 带限额的同伴招募并记录网络规模 | 某些难接触人群 | 依赖网络、招募与报告假设;估计敏感 |
| 志愿网络面板 | 在线邀请自愿者 | 快速重复测量 | 数字鸿沟、职业答题者、自选 |
“样本在人口学边际上看起来相似”不等于所有与结局有关的选择因素都已平衡。后分层和倾向加权可能改善已测变量差异,无法自动修复未测选择或完全没有覆盖概率的人群。
recruitment <- data.frame(
stage = c("抽样框记录", "抽中", "确认符合资格", "同意参加",
"完成基线", "完成 12 月随访", "进入主要分析"),
n = c(5200, 900, 760, 612, 598, 521, 509)
)
recruitment$proportion_from_previous_stage <-
c(NA, recruitment$n[-1] / recruitment$n[-nrow(recruitment)])
recruitment$proportion_of_sampled <-
c(NA, recruitment$n[-1] / recruitment$n[2])
recruitment分母必须与报告术语匹配:联系率、合作率、应答率和留存率不是同一指标。调查项目可采用 AAPOR 等标准定义;试验按 CONSORT 流程图报告筛选、随机、随访与分析。
常见最终权重可写为:
加权、分层和聚类必须同时进入方差估计。把权重交给普通
lm() 或只复制高权重记录,并不能得到正确的设计型标准误。
下面创建一个有限总体,故意对三个地区各抽相同人数。简单样本均值会把三个地区各算三分之一;设计权重恢复各地区在总体中的比例。
set.seed(1005)
population <- data.frame(
id = 1:6000,
region = rep(c("北", "中", "南"), times = c(1200, 3000, 1800))
)
region_risk <- c("北" = 0.08, "中" = 0.15, "南" = 0.24)
population$outcome <- rbinom(
nrow(population), 1, prob = region_risk[population$region]
)
sample_parts <- lapply(split(population, population$region), function(d) {
d[sample.int(nrow(d), 180), ]
})
survey_sample <- do.call(rbind, sample_parts)
row.names(survey_sample) <- NULL
Nh <- table(population$region)
nh <- table(survey_sample$region)
survey_sample$weight <-
as.numeric(Nh[survey_sample$region] / nh[survey_sample$region])
unweighted <- mean(survey_sample$outcome)
weighted <- with(survey_sample, sum(weight * outcome) / sum(weight))
truth <- mean(population$outcome)
c(unweighted_sample = unweighted,
design_weighted = weighted,
finite_population_truth = truth)## unweighted_sample design_weighted finite_population_truth
## 0.1389 0.1422 0.1635
可在仅用于教学的 SRS 近似下计算权重有效样本量:
with(survey_sample, {
c(actual_n = length(weight),
weight_effective_n = sum(weight)^2 / sum(weight^2),
min_weight = min(weight),
max_weight = max(weight))
})## actual_n weight_effective_n min_weight max_weight
## 540.000 473.684 6.667 16.667
这不是完整的复杂抽样方差。正式分析应使用能表示 strata、cluster、有限总体校正和权重的调查分析软件,并明确单单位层与重复权重的处理。
样本量规划需要同时说明:
最好对乐观、中间、保守场景做敏感性表,而不是报告一个虚假精确的整数。
在 SRS、大样本正态近似下,为使双侧 置信区间半宽约为 :
若总体有限且无放回:
再考虑设计效应 和预期有效应答率 :
若没有可信的 ,取 给出最大方差,但仍应展示其他合理情景。
n_prevalence <- function(p = 0.5, margin = 0.05, confidence = 0.95,
population_size = Inf, design_effect = 1,
usable_response = 1) {
stopifnot(length(p) == 1L, is.finite(p), p > 0, p < 1,
length(margin) == 1L, is.finite(margin), margin > 0,
length(confidence) == 1L, is.finite(confidence),
confidence > 0, confidence < 1,
length(population_size) == 1L,
population_size == Inf ||
(is.finite(population_size) && population_size >= 1 &&
population_size == floor(population_size)),
length(design_effect) == 1L, is.finite(design_effect),
design_effect > 0,
length(usable_response) == 1L, is.finite(usable_response),
usable_response > 0, usable_response <= 1)
z <- qnorm(1 - (1 - confidence) / 2)
n0 <- z^2 * p * (1 - p) / margin^2
n_fpc <- if (is.finite(population_size)) {
population_size * n0 / (population_size + n0 - 1)
} else {
n0
}
required_invitations <- ceiling(n_fpc * design_effect / usable_response)
data.frame(
srs_required_complete = ceiling(n_fpc),
required_invitations = required_invitations,
exceeds_sampling_frame = is.finite(population_size) &&
required_invitations > population_size,
assumptions = sprintf("p=%.2f, d=%.3f, DEFF=%.2f, usable=%.2f",
p, margin, design_effect, usable_response)
)
}
n_prevalence(p = 0.20, margin = 0.03,
population_size = 10000,
design_effect = 1.5, usable_response = 0.75)这里的 usable_response
应包含预期的无资格、拒绝和无法使用记录,且不能把一个阶段的 80%
错当作总体 80%。若资格 90%、同意 70%、完成 90%,总比例是
。分层等设计有时可使
,因此函数接受任意正设计效应;若
exceeds_sampling_frame 为
TRUE,说明当前精度、应答与设计假设要求邀请的人数超过可用抽样框,不能靠抽取不存在的单位解决,应重新评估精度、设计、覆盖或实施方案。
对等分配的近似样本量常由两比例正态近似得到。下面函数还允许实验组与对照组样本比 。 应来自临床/公共卫生最小重要差异,而不是直接采用小型先导研究的乐观点估计。
n_two_proportions <- function(p0, p1, allocation_ratio = 1,
alpha = 0.05, power = 0.80) {
stopifnot(p0 > 0, p0 < 1, p1 > 0, p1 < 1,
allocation_ratio > 0, alpha > 0, alpha < 1,
power > 0, power < 1, p0 != p1)
k <- allocation_ratio
p_bar <- (p0 + k * p1) / (1 + k)
z_alpha <- qnorm(1 - alpha / 2)
z_power <- qnorm(power)
null_variance_factor <- p_bar * (1 - p_bar) * (1 + 1 / k)
alt_variance_factor <- p0 * (1 - p0) + p1 * (1 - p1) / k
n0 <- ((z_alpha * sqrt(null_variance_factor) +
z_power * sqrt(alt_variance_factor)) / abs(p1 - p0))^2
n1 <- k * n0
data.frame(control = ceiling(n0), intervention = ceiling(n1),
total = ceiling(n0) + ceiling(n1))
}
n_two_proportions(p0 = 0.30, p1 = 0.22,
allocation_ratio = 1, power = 0.90)对基线风险 30%、希望检出绝对下降 8 个百分点的试验,函数给出每组需要的可分析个体数。随后应按聚类、失访和不依从对真正目标效应的影响调整,而不是机械加 10%。
在等方差、等分配、独立观察的近似下,每组:
n_two_means <- function(sd, difference, alpha = 0.05, power = 0.80) {
stopifnot(sd > 0, difference != 0, alpha > 0, alpha < 1,
power > 0, power < 1)
z_alpha <- qnorm(1 - alpha / 2)
z_power <- qnorm(power)
per_group <- 2 * (z_alpha + z_power)^2 * sd^2 / difference^2
ceiling(per_group)
}
c(per_group = n_two_means(sd = 12, difference = 5, power = 0.90),
standardized_difference = 5 / 12)## per_group standardized_difference
## 122.0000 0.4167
给定对照组暴露比例 和期望检出的优势比 ,可换算病例组预期暴露比例:
再使用两独立比例公式。对照:病例超过约 4:1 后,新增对照的边际效率通常很小;具体仍取决于成本、匹配和分析。
n_case_control <- function(control_exposure, odds_ratio,
controls_per_case = 1,
alpha = 0.05, power = 0.80) {
p0 <- control_exposure
p1 <- odds_ratio * p0 / (1 - p0 + odds_ratio * p0)
# n1/n0 在通用函数中;这里 1=病例,0=对照。
result <- n_two_proportions(
p0 = p0, p1 = p1,
allocation_ratio = 1 / controls_per_case,
alpha = alpha, power = power
)
names(result)[1:2] <- c("controls", "cases")
cbind(result, assumed_case_exposure = round(p1, 3))
}
n_case_control(control_exposure = 0.20, odds_ratio = 1.75,
controls_per_case = 2, power = 0.90)这是假定独立、未匹配、无测量误差的近似。匹配对设计的影响取决于病例-对照对内暴露不一致概率,不能用这个函数直接声称足够把握度。
若每群平均 人、组内相关系数 (ICC)近似相同:
群大小不等时,一个常用近似为:
其中 是群大小变异系数。
cluster_design_effect <- function(mean_cluster_size, icc,
cluster_size_cv = 0) {
stopifnot(mean_cluster_size >= 1, icc >= 0, icc < 1,
cluster_size_cv >= 0)
1 + (((1 + cluster_size_cv^2) * mean_cluster_size) - 1) * icc
}
deff_equal <- cluster_design_effect(30, icc = 0.03)
deff_unequal <- cluster_design_effect(30, icc = 0.03,
cluster_size_cv = 0.50)
c(equal_cluster_sizes = deff_equal,
unequal_cluster_sizes = deff_unequal,
individual_equivalent_of_600_people = 600 / deff_unequal)## equal_cluster_sizes unequal_cluster_sizes
## 1.870 2.095
## individual_equivalent_of_600_people
## 286.396
整群试验不能只把个体样本量乘 DEFF 后随意决定群数。自由度、基线群数不平衡、干预层次和可实现的最少群数都很关键;很少的群需要小样本修正,功效主要受群数约束。
在比例危险假设下、两组分配比例为 与 时,检出危险比(hazard ratio, )所需事件数的常见近似:
required_events <- function(hazard_ratio, allocation_fraction = 0.5,
alpha = 0.05, power = 0.80) {
stopifnot(hazard_ratio > 0, hazard_ratio != 1,
allocation_fraction > 0, allocation_fraction < 1)
z_alpha <- qnorm(1 - alpha / 2)
z_power <- qnorm(power)
ceiling((z_alpha + z_power)^2 /
(allocation_fraction * (1 - allocation_fraction) *
log(hazard_ratio)^2))
}
required_events(hazard_ratio = 0.75, power = 0.90)## [1] 508
事件数需再结合累积入组、基线风险、竞争事件、随访期和失访转成总人数。若比例风险不成立或目标是固定时点风险差/限制平均生存时间,应按相应 estimand 重新规划。
scenarios <- expand.grid(
prevalence = c(0.10, 0.20, 0.30),
response = c(0.60, 0.75, 0.90),
design_effect = c(1.0, 1.5)
)
scenarios[["required_invitations"]] <- mapply(
function(p, r, d) {
n_prevalence(p = p, margin = 0.03,
population_size = 10000,
design_effect = d,
usable_response = r)[["required_invitations"]]
},
scenarios[["prevalence"]],
scenarios[["response"]],
scenarios[["design_effect"]]
)
scenarios[with(scenarios,
order(design_effect, prevalence, response)), ]偏倚是估计系统性偏离目标量,不等于随机误差。常见来源:
考虑 为吸烟, 为职业粉尘, 为肺病, 为炎症中介, 为因 或 影响的入院选择:
nodes <- data.frame(
# 图内使用变量代号,避免不同操作系统缺少中文绘图字体;正文解释含义。
name = c("C", "E", "M", "Y", "S"),
x = c(1, 2, 3, 4, 3),
y = c(2, 3, 3, 2, 1)
)
plot(nodes$x, nodes$y, type = "n", axes = FALSE,
xlab = "", ylab = "", xlim = c(0.5, 4.5), ylim = c(0.6, 3.4))
edges <- rbind(
c(1, 2), c(1, 4), c(2, 3), c(3, 4), c(2, 5), c(4, 5)
)
for (i in seq_len(nrow(edges))) {
from <- edges[i, 1]
to <- edges[i, 2]
arrows(nodes$x[from], nodes$y[from], nodes$x[to], nodes$y[to],
length = 0.09, col = "#0b6b66", lwd = 1.7)
}
points(nodes$x, nodes$y, pch = 21, cex = 5.2,
bg = "#e8f5f1", col = "#17365d", lwd = 1.5)
text(nodes$x, nodes$y, labels = nodes$name, cex = 0.82)一个教学用因果图:C 是混杂因素,M 是中介,S 是碰撞点/选择变量。
可复制以下骨架:
标题与方案版本:
研究团队、职责与利益冲突:
背景与决策需求:
主要/次要目标与假设:
PECO/PICO(T):
主要 estimand:人群、策略、结局、汇总、干预后事件
研究设计与理由:
场景、来源人群和研究时间:
纳入/排除标准与共同时间零点:
抽样框、抽样阶段、入样概率与预设备用样本/不替补规则:
招募、同意、补偿和留存:
暴露/干预、对照和防污染措施:
结局与协变量:来源、时间窗、效度、盲法
样本量:公式/模拟、假设来源、情景、膨胀
数据流程:采集、验证、去重、链接、质控
统计分析计划摘要:
伦理、公平、隐私和社区治理:
安全监测与停止规则(如适用):
注册、传播、数据/代码共享与结果回馈:
进度、预算、可行性指标与风险缓解:
SAP 应在查看分组结局或主要关联之前定稿并加时间戳。它比方案统计部分更具体,使另一位分析师可以重现决策。
先区分变量未测、失访、行政删失、结构性不适用与数据链接失败。完整病例分析有效需要具体条件;“缺失比例低”并不能保证无偏。多重插补模型应包含分析变量、与缺失有关变量及设计信息,并与 estimand 和实质模型兼容。对可能非随机缺失,应做模式混合、选择模型或界值情景等敏感性分析。
这个例子展示如何先定义数据生成和目标量,再估计粗关联与调整关联。它用于教学,不代表任意观察队列只需一个 logistic 回归就能得出因果结论。
set.seed(1006)
n_cohort <- 1500
cohort <- data.frame(
age = round(runif(n_cohort, 30, 75)),
smoker = rbinom(n_cohort, 1, 0.28)
)
# 年龄和吸烟影响暴露;年龄、吸烟、暴露共同影响结局。
cohort$exposed <- rbinom(
n_cohort, 1,
plogis(-2.0 + 0.018 * cohort$age + 0.85 * cohort$smoker)
)
cohort$outcome <- rbinom(
n_cohort, 1,
plogis(-4.2 + 0.035 * cohort$age +
0.70 * cohort$smoker + 0.65 * cohort$exposed)
)
with(cohort, table(exposed, outcome))## outcome
## exposed 0 1
## 0 919 116
## 1 363 102
crude_model <- glm(outcome ~ exposed, data = cohort,
family = binomial())
adjusted_model <- glm(outcome ~ exposed + age + smoker, data = cohort,
family = binomial())
extract_or <- function(model, term) {
estimate <- coef(model)[term]
standard_error <- sqrt(diag(vcov(model)))[term]
c(OR = exp(estimate),
lower_95 = exp(estimate - qnorm(0.975) * standard_error),
upper_95 = exp(estimate + qnorm(0.975) * standard_error))
}
rbind(
crude = extract_or(crude_model, "exposed"),
adjusted = extract_or(adjusted_model, "exposed")
)## OR.exposed lower_95.exposed upper_95.exposed
## crude 2.226 1.662 2.982
## adjusted 1.703 1.253 2.315
逻辑回归系数是条件优势比;结局不罕见时不应称为风险比。若 estimand 是边际风险差,可从已拟合模型对每个人分别设 和 后标准化:
data_exposed <- transform(cohort, exposed = 1)
data_unexposed <- transform(cohort, exposed = 0)
risk_if_exposed <- mean(predict(adjusted_model,
newdata = data_exposed,
type = "response"))
risk_if_unexposed <- mean(predict(adjusted_model,
newdata = data_unexposed,
type = "response"))
c(risk_if_exposed = risk_if_exposed,
risk_if_unexposed = risk_if_unexposed,
standardized_risk_difference = risk_if_exposed - risk_if_unexposed,
standardized_risk_ratio = risk_if_exposed / risk_if_unexposed)## risk_if_exposed risk_if_unexposed standardized_risk_difference
## 0.18791 0.12212 0.06578
## standardized_risk_ratio
## 1.53868
这个点估计仍依赖无未测混杂、一致性、正值性和模型正确等假设;正式分析还需适当置信区间(例如 bootstrap 或影响函数方法)及敏感性分析。
问题:2026 年某城市 18 岁以上常住居民中,按标准化测量定义的高血压患病率是多少?
可按地区和城乡分层,以规模概率抽学校,再在校内从完整学生名单简单随机/系统抽学生。总体入样概率是学校概率乘校内概率,基础权重取倒数,再做非应答调整与可信学生总数校准。偏倚包括失学/缺勤学生未覆盖、学校拒绝、学生自报误分类、家长同意造成选择,以及不同学校应答差异。
为阻断 的后门路径,应考虑调整基线共同原因 。 位于目标因果路径上;估计总效应时调整它会阻断部分效应,并可能引入中介-结局未测混杂导致的偏倚。若目标是直接效应,需要重新定义 estimand 和更强识别条件。
“6 个月仍用药”要求参与者先存活并被观察到 6 个月,但随访却从首次处方开始,形成不死时间和用未来信息分类。可在基线随机/模拟分配策略并设宽限期,用克隆-删失-加权等适当方法;或在 6 个月做 landmark 分析,只对届时存活且符合资格者估计条件效应,明确改变后的目标人群。
不能。大样本只降低随机误差;自愿参加可能与未测的症状、数字接入、求助行为等有关。需比较抽样框/行政辅助变量、说明覆盖和邀请机制、评估不同招募模式,使用校准或选择模型,并对未测选择做情景/界值分析。结论应限定于假设可支持的范围。
| 中文 | English | 简明定义 |
|---|---|---|
| 目标人群 | Target population | 希望结论适用的人群 |
| 来源人群 | Source population | 实际产生参与者/病例的人群 |
| 抽样框 | Sampling frame | 可操作的抽样单位列表或机制 |
| 入样概率 | Inclusion probability | 某单位通过全部阶段进入样本的概率 |
| 设计权重 | Design/base weight | 入样概率的倒数 |
| 有限总体校正 | Finite population correction | 无放回抽取较大比例总体时的方差修正 |
| 设计效应 | Design effect, DEFF | 实际设计方差与同样本量 SRS 方差之比 |
| 组内相关 | Intracluster correlation, ICC | 同群观察相似程度 |
| 目标效应 | Estimand | 研究要估计的精确定义量 |
| 时间零点 | Time zero | 资格、策略分配与随访同时对齐的起点 |
| 目标试验 | Target trial | 希望观察数据模拟的理想随机试验方案 |
| 选择偏倚 | Selection bias | 选择机制使比较偏离目标关系 |
| 信息偏倚 | Information bias | 测量误差或误分类造成系统性偏离 |
| 混杂 | Confounding | 共同原因造成暴露组不可比 |
| 碰撞点 | Collider | 接收两个变量箭头的共同结果;条件化可开路径 |
| 中介 | Mediator | 位于暴露到结局因果路径上的变量 |
| 正值性 | Positivity | 每类协变量下各策略都有非零可能 |
| 意向治疗 | Intention-to-treat | 按随机分配策略比较,不按实际依从重分组 |
| 非应答调整 | Nonresponse adjustment | 利用辅助信息修正不同应答概率 |
| 校准 | Calibration | 使加权样本边际匹配可信总体总量 |
| 统计分析计划 | Statistical analysis plan, SAP | 在结果揭示前规定分析细节的文件 |
建议阅读顺序:先用本教程把问题、目标效应、设计和抽样连成一条线;再按自己的研究类型查阅相应方法教材、伦理规范和报告清单。具体项目应同时吸收主题专家、统计学家、数据管理人员以及受影响患者或社区的意见。