生存分析

先查看各命令展开的示例,再按需展开其他选项及 R 实现。改写代码前,请阅读适用条件及差异说明。

estat

Cox回归后删失结局一致性

Stata

estat concordance

R 包:survival

survival::concordance(fit)

与 Stata 有差异 固定流程;请明确调整示例列名。删失权重及风险和时间并列处理影响统计量。

另有 1 个示例及替代实现

Cox比例风险诊断

Stata

estat phtest, detail

R 包:survival

survival::cox.zph(fit, transform = "identity")

与 Stata 有差异 固定流程;请明确调整示例列名。Schoenfeld残差实现及默认时间变换可能不同。

ltable

固定区间的精算寿命表生存率

Stata

ltable time event, intervals(0 2 4 6)

R 包:base

{ ends <- c(2, 4, 6); starts <- c(0, 2, 4); n <- vapply(starts, function(t) sum(data$time >= t), integer(1)); d <- vapply(seq_along(ends), function(i) sum(data$time >= starts[i] & data$time < ends[i] & data$event == 1), integer(1)); w <- vapply(seq_along(ends), function(i) sum(data$time >= starts[i] & data$time < ends[i] & data$event == 0), integer(1)); q <- d / (n - w / 2); data.frame(start = starts, end = ends, at_risk = n, failures = d, withdrawals = w, survival = cumprod(1 - q)) }

与 Stata 有差异 固定流程;请明确调整示例列名。使用退出人数减半的精算修正及左闭区间,假设区间内删失均匀;须统一边界规则和分组区间。

predict

根据累积风险计算Cox基线生存率

Stata

predict baseS, basesurv

R 包:survival

{ h <- survival::basehaz(fit, centered = FALSE); data.frame(time = h$time, survival = exp(-h$hazard)) }

固定流程;请明确调整示例列名。基线对应零协变量;须核对目标参考特征。Stata basesurv采用乘积极限构造,exp(-累积风险)是替代估计,不保证数值一致。

另有 11 个示例及替代实现

零协变量处基线累积风险

Stata

predict basehaz, basechazard

R 包:survival

survival::basehaz(fit, centered = FALSE)

与 Stata 有差异 固定流程;请明确调整示例列名。Cox基线明确对应零协变量;Stata按观察存储,R按唯一事件或删失时间返回。

loglogistic AFT条件中位生存时间

Stata

predict median_time, median

R 包:survival

stats::predict(fit, type = "quantile", p = .5)

与 Stata 有差异 固定流程;请明确调整示例列名。预测特定分布的生存时间分位数,并非平均时间。

Cox回归偏差残差

Stata

predict residual*, deviance

R 包:survival

stats::residuals(fit, type = "deviance")

与 Stata 有差异 固定流程;请明确调整示例列名。Schoenfeld残差每个事件一行;得分和影响残差每个观察一行。

Cox系数影响残差

Stata

predict residual*, dfbeta

R 包:survival

stats::residuals(fit, type = "dfbeta")

与 Stata 有差异 固定流程;请明确调整示例列名。Schoenfeld残差每个事件一行;得分和影响残差每个观察一行。

Cox回归鞅残差

Stata

predict residual*, mgale

R 包:survival

stats::residuals(fit, type = "martingale")

与 Stata 有差异 固定流程;请明确调整示例列名。Schoenfeld残差每个事件一行;得分和影响残差每个观察一行。

标准化Schoenfeld残差

Stata

predict residual*, scaledsch

R 包:survival

stats::residuals(fit, type = "scaledsch")

与 Stata 有差异 固定流程;请明确调整示例列名。Schoenfeld残差每个事件一行;得分和影响残差每个观察一行。

事件特异Schoenfeld残差

Stata

predict residual*, schoenfeld

R 包:survival

stats::residuals(fit, type = "schoenfeld")

与 Stata 有差异 固定流程;请明确调整示例列名。Schoenfeld残差每个事件一行;得分和影响残差每个观察一行。

Cox得分贡献

Stata

predict residual*, scores

R 包:survival

stats::residuals(fit, type = "score")

与 Stata 有差异 固定流程;请明确调整示例列名。Schoenfeld残差每个事件一行;得分和影响残差每个观察一行。

Cox-Snell期望事件量

Stata

predict value, csnell

R 包:survival

stats::predict(fit, type = "expected", reference = "zero")

与 Stata 有差异 固定流程;请明确调整示例列名。相对预测明确以零为中心;期望事件量取决于各观察的随访时间。

Cox相对风险得分

Stata

predict value, hr

R 包:survival

stats::predict(fit, type = "risk", reference = "zero")

与 Stata 有差异 固定流程;请明确调整示例列名。相对预测明确以零为中心;期望事件量取决于各观察的随访时间。

Cox线性预测量

Stata

predict value, xb

R 包:survival

stats::predict(fit, type = "lp", reference = "zero")

与 Stata 有差异 固定流程;请明确调整示例列名。相对预测明确以零为中心;期望事件量取决于各观察的随访时间。

snapspan

将快照转为协变量向后续区间生效的区间数据

Stata

snapspan id time event, generate(start)

R 包:stats

{ out <- data[order(data$id, data$time), ]; previous <- ave(out$time, out$id, FUN = function(v) c(NA_real_, head(v, -1))); previous_x <- ave(out$x, out$id, FUN = function(v) c(NA_real_, head(v, -1))); out$start <- previous; out$x <- previous_x; out[!is.na(out$start), ] }

固定流程;请明确调整示例列名。首个快照定义进入时间,事件在区间末发生,普通协变量向后续区间生效;本流程剔除初始零长度行,比较行数时须核对Stata保留的基线行。

stbase

保留每位受试者的基线记录

Stata

stbase

R 包:base

data[order(data$id, data$start), ][!duplicated(data[order(data$id, data$start), "id"]), ]

固定流程;请明确调整示例列名。仅选择记录;stbase还可能变换生存时间字段。

stci

中位生存时间及置信限

Stata

stci, median

R 包:survival

stats::quantile(survival::survfit(s ~ 1), probs = .5)

与 Stata 有差异 固定流程;请明确调整示例列名。中位数插值和置信限约定可能不同。

截断于时间九的限制平均生存时间

Stata

stci, rmean

R 包:survival

summary(survival::survfit(s ~ 1), rmean = "common")$table

与 Stata 有差异 rmean=“common”将生存曲线积分限制在最大观测随访时间,与Stata的stci, rmean一致,不向随访期外推。须统一分析样本和删失声明。

stcox

Cox 比例风险模型

Stata

stcox x1 x2

R 包:survival

survival::coxph(survival::Surv(time, died) ~ x1 + x2, data = data)

与 Stata 有差异 exp(coef(fit)) 给出 stcox 报告的风险比。 coxph() 默认用 Efron 处理并列事件;Stata stcox 默认 Breslow。设 ties = “breslow” 可匹配并列事件似然。

另有 9 个示例及替代实现

Cox模型的组别协变量交互

Stata

stcox c.x##i.group

R 包:survival

survival::coxph(survival::Surv(time, event) ~ x * factor(group), ties = "breslow", data = data)

与 Stata 有差异 固定流程;请明确调整示例列名。须明确统一并列事件、风险区间、权重和参考推断。

Breslow结点处理的Cox回归

Stata

stcox x z

R 包:survival

survival::coxph(survival::Surv(time, event) ~ x + z, data = data, ties = "breslow")

与 Stata 有差异 固定流程;请明确调整示例列名。须明确统一并列事件、风险区间、权重和参考推断。

加权Cox模型与三明治协方差

Stata

stcox x z [pw=w], vce(robust)

R 包:survival

survival::coxph(survival::Surv(time, event) ~ x + z, ties = "breslow", data = data, weights = w, robust = TRUE)

与 Stata 有差异 固定流程;请明确调整示例列名。须明确统一并列事件、风险区间、权重和参考推断。

Efron结点处理的Cox回归

Stata

stcox x z, efron

R 包:survival

survival::coxph(survival::Surv(time, event) ~ x + z, data = data, ties = "efron")

与 Stata 有差异 固定流程;请明确调整示例列名。须明确统一并列事件、风险区间、权重和参考推断。

精确部分似然Cox回归

Stata

stcox x z, exactp

R 包:survival

survival::coxph(survival::Surv(time, event) ~ x + z, data = data, ties = "exact")

与 Stata 有差异 固定流程;请明确调整示例列名。须明确统一并列事件、风险区间、权重和参考推断。

共享Gamma脆弱性Cox模型

Stata

stcox x z, shared(id)

R 包:survival

survival::coxph(survival::Surv(time, event) ~ x + z + frailty(id, distribution = "gamma"), ties = "breslow", data = data)

与 Stata 有差异 固定流程;请明确调整示例列名。须明确统一并列事件、风险区间、权重和参考推断。

分层Cox基线风险

Stata

stcox x z, strata(group)

R 包:survival

survival::coxph(survival::Surv(time, event) ~ x + z + strata(group), ties = "breslow", data = data)

与 Stata 有差异 固定流程;请明确调整示例列名。须明确统一并列事件、风险区间、权重和参考推断。

聚类稳健Cox推断

Stata

stcox x z, vce(cluster id)

R 包:survival

survival::coxph(survival::Surv(time, event) ~ x + z, ties = "breslow", data = data, cluster = id)

与 Stata 有差异 固定流程;请明确调整示例列名。须明确统一并列事件、风险区间、权重和参考推断。

Cox对数时间变化系数

Stata

stcox x, tvc(z) texp(ln(_t))

R 包:survival

survival::coxph(survival::Surv(time, event) ~ x + tt(z), ties = "breslow", data = data, tt = function(z, t, ...) z * log(t))

与 Stata 有差异 固定流程;请明确调整示例列名。须明确统一并列事件、风险区间、权重和参考推断。

stcrreg

Fine-Gray亚分布风险流程

Stata

stcrreg x z, compete(cause==2)

R 包:survival

{ expanded <- survival::finegray(survival::Surv(time, cause) ~ x + z + id, data = data, etype = "target"); survival::coxph(survival::Surv(fgstart, fgstop, fgstatus) ~ x + z, data = expanded, weights = fgwt, cluster = id) }

与 Stata 有差异 固定流程;请明确调整示例列名。使用加权扩展数据实现;删失权重和方差方法可能不同。

stdescribe

描述单记录生存数据

Stata

stdescribe

R 包:base

data.frame(subjects = nrow(data), failures = sum(data$event), time_at_risk = sum(data$time))

固定流程;请明确调整示例列名。示例为零进入时间的单记录数据;多记录受试者须按唯一ID计数。

stfill

在生存分析受试者内向前携带已观察协变量

Stata

stfill z, forward

R 包:zoo

{ out <- data[order(data$id, data$start), ]; out$z <- ave(out$z, out$id, FUN = function(v) zoo::na.locf(v, na.rm = FALSE)); out }

与 Stata 有差异 固定流程;请明确调整示例列名。要求区间顺序正确且不重叠;开头缺失仍保留,后续信息不会向前期回填。

stgen

标记生存观察史中曾经暴露的受试者

Stata

stgen ever_x = ever(x==1)

R 包:stats

transform(data, ever_x = ave(x == 1, id, FUN = function(v) as.integer(any(v))))

与 Stata 有差异 固定流程;请明确调整示例列名。所有已观察区间均参与历史计算;暴露缺失值须明确处理,不能默认当作未暴露。

stintreg

区间删失对数正态回归

Stata

stintreg x, interval(lower upper) distribution(lognormal)

R 包:survival

survival::survreg(survival::Surv(lower, upper, type = "interval2") ~ x, data = data, dist = "lognormal")

与 Stata 有差异 Stata必须指定interval(lower upper)。Weibull的time选项选择AFT系数,与survreg对应,而非Stata默认的PH系数。interval2中端点相等为精确事件,下端点NA表示左删失,上端点NA表示右删失;须显式转换Stata的左删失边界。

区间删失Weibull回归

Stata

stintreg x, interval(lower upper) distribution(weibull) time

R 包:survival

survival::survreg(survival::Surv(lower, upper, type = "interval2") ~ x, data = data, dist = "weibull")

与 Stata 有差异 Stata必须指定interval(lower upper)。Weibull的time选项选择AFT系数,与survreg对应,而非Stata默认的PH系数。interval2中端点相等为精确事件,下端点NA表示左删失,上端点NA表示右删失;须显式转换Stata的左删失边界。

stir

比较两组发生率

Stata

stir group

R 包:stats

{ counts <- tapply(data$event, data$group, sum); times <- tapply(data$time, data$group, sum); stats::poisson.test(counts, T = times) }

与 Stata 有差异 固定流程;请明确调整示例列名。R提供条件精确检验和区间,Stata默认区间方法可能不同。

stjoin

合并相邻且协变量恒定的区间

Stata

stjoin

R 包:stats

{ out <- stats::aggregate(cbind(time = time - start, event) ~ id, data = spells, sum); names(out)[2] <- "duration"; out }

固定流程;请明确调整示例列名。仅当相邻区间协变量完全一致且中间无事件时有效;合并前须检查。

stmh

Mantel-Haenszel分层发生率比点估计

Stata

stmh exposed stratum

R 包:base

with(data, sum(events1 * time0 / (time1 + time0)) / sum(events0 * time1 / (time1 + time0)))

固定流程;请明确调整示例列名。输入为按暴露和分层汇总的事件数及人时;仅计算发生率比点估计,不含Stata的方差和趋势检验。

stptime

按人时计算粗发生率

Stata

stptime

R 包:base

{ pt <- sum(data$time); events <- sum(data$event); c(person_time = pt, failures = events, rate = events / pt) }

固定流程;请明确调整示例列名。假设进入时间为零且观察区间互不重叠。

strate

每千人时的分组发生率

Stata

strate group, per(1000)

R 包:stats

{ out <- stats::aggregate(cbind(time, event) ~ group, data, sum); out$rate_per_1000 <- 1000 * out$event / out$time; out }

固定流程;请明确调整示例列名。仅计算点发生率;置信区间方法须另行选择。

streg

参数生存模型

Stata

streg x, distribution(weibull)

R 包:survival

survival::survreg(survival::Surv(time, died) ~ x, data = data, dist = "weibull")

与 Stata 有差异 survreg() 报告加速失效时间形式;Stata 的 Weibull 默认使用风险形式,因此符号和尺度不同。

另有 7 个示例及替代实现

exponential加速失效时间模型

Stata

streg x z, distribution(exponential) time

R 包:survival

survival::survreg(survival::Surv(time, event) ~ x + z, data = data, dist = "exponential")

与 Stata 有差异 固定流程;请明确调整示例列名。survreg报告AFT系数;转换为Weibull比例风险系数须调整符号和尺度。

loglogistic加速失效时间模型

Stata

streg x z, distribution(loglogistic) time

R 包:survival

survival::survreg(survival::Surv(time, event) ~ x + z, data = data, dist = "loglogistic")

与 Stata 有差异 固定流程;请明确调整示例列名。survreg报告AFT系数;转换为Weibull比例风险系数须调整符号和尺度。

lognormal加速失效时间模型

Stata

streg x z, distribution(lognormal) time

R 包:survival

survival::survreg(survival::Surv(time, event) ~ x + z, data = data, dist = "lognormal")

与 Stata 有差异 固定流程;请明确调整示例列名。survreg报告AFT系数;转换为Weibull比例风险系数须调整符号和尺度。

weibull加速失效时间模型

Stata

streg x z, distribution(weibull) time

R 包:survival

survival::survreg(survival::Surv(time, event) ~ x + z, data = data, dist = "weibull")

与 Stata 有差异 固定流程;请明确调整示例列名。survreg报告AFT系数;转换为Weibull比例风险系数须调整符号和尺度。

loglogistic分组尺度加速失效模型

Stata

streg x, distribution(loglogistic) strata(group) time

R 包:survival

survival::survreg(survival::Surv(time, event) ~ x + factor(group) + strata(group), data = data, dist = "loglogistic")

与 Stata 有差异 factor(group)提供分层截距,strata(group)提供分层尺度,与Stata的streg, strata()对应。survreg报告AFT系数;比较Stata的Weibull或指数模型风险比输出前须转换系数。

lognormal分组尺度加速失效模型

Stata

streg x, distribution(lognormal) strata(group) time

R 包:survival

survival::survreg(survival::Surv(time, event) ~ x + factor(group) + strata(group), data = data, dist = "lognormal")

与 Stata 有差异 factor(group)提供分层截距,strata(group)提供分层尺度,与Stata的streg, strata()对应。survreg报告AFT系数;比较Stata的Weibull或指数模型风险比输出前须转换系数。

weibull分组尺度加速失效模型

Stata

streg x, distribution(weibull) strata(group) time

R 包:survival

survival::survreg(survival::Surv(time, event) ~ x + factor(group) + strata(group), data = data, dist = "weibull")

与 Stata 有差异 factor(group)提供分层截距,strata(group)提供分层尺度,与Stata的streg, strata()对应。survreg报告AFT系数;比较Stata的Weibull或指数模型风险比输出前须转换系数。

sts

Kaplan-Meier 生存曲线

Stata

sts graph

R 包:survival

plot(survival::survfit(survival::Surv(time, died) ~ 1, data = data))

Log-rank 检验

Stata

sts test group

R 包:survival

survival::survdiff(survival::Surv(time, died) ~ group, data = data)
另有 8 个示例及替代实现

Kaplan-Meier生存曲线数据

Stata

sts list

R 包:survival

survival::survfit(s ~ 1)

与 Stata 有差异 固定流程;请明确调整示例列名。R返回曲线数据;比较时须明确置信变换和并列事件处理。

分组Kaplan-Meier曲线

Stata

sts list, by(group)

R 包:survival

survival::survfit(s ~ data$group)

与 Stata 有差异 固定流程;请明确调整示例列名。R返回曲线数据;比较时须明确置信变换和并列事件处理。

Nelson-Aalen累积风险

Stata

sts list, cumhaz

R 包:survival

{ f <- survival::survfit(s ~ 1); data.frame(time = f$time, cumhaz = f$cumhaz) }

与 Stata 有差异 固定流程;请明确调整示例列名。R返回曲线数据;比较时须明确置信变换和并列事件处理。

累积失败概率

Stata

sts list, failure

R 包:survival

{ f <- survival::survfit(s ~ 1); data.frame(time = f$time, failure = 1 - f$surv) }

与 Stata 有差异 固定流程;请明确调整示例列名。R返回曲线数据;比较时须明确置信变换和并列事件处理。

Kaplan-Meier区间变换:log

Stata

sts list, level(95)

R 包:survival

survival::survfit(s ~ 1, conf.type = "log", conf.int = .95)

固定流程;请明确调整示例列名。明确选择R的置信变换;Stata默认显示方式可能不同。

Kaplan-Meier区间变换:log-log

Stata

sts list, level(95)

R 包:survival

survival::survfit(s ~ 1, conf.type = "log-log", conf.int = .95)

固定流程;请明确调整示例列名。明确选择R的置信变换;Stata默认显示方式可能不同。

Kaplan-Meier区间变换:plain

Stata

sts list, level(95)

R 包:survival

survival::survfit(s ~ 1, conf.type = "plain", conf.int = .95)

固定流程;请明确调整示例列名。明确选择R的置信变换;Stata默认显示方式可能不同。

生存曲线Log-rank比较

Stata

sts test group 

R 包:survival

survival::survdiff(s ~ data$group, rho = 0)

与 Stata 有差异 固定流程;请明确调整示例列名。未分层的两组Log-rank检验。

stset

声明生存时间数据

Stata

stset time, failure(died)

R 包:survival

survival::Surv(data$time, data$died)

R 不需要声明:在每个模型公式左边写 Surv(time, died) 即可。

另有 2 个示例及替代实现

延迟进入计数过程响应

Stata

stset exit, enter(time entry) failure(event)

R 包:survival

survival::Surv(data$entry, data$time, data$event)

与 Stata 有差异 固定流程;请明确调整示例列名。明确提供进入和退出时间;多区间数据每个风险区间应占一行。

右删失生存响应

Stata

stset time, failure(event)

R 包:survival

survival::Surv(data$time, data$event)

与 Stata 有差异 固定流程;请明确调整示例列名。创建生存响应对象,不改变全局数据声明状态。

stsplit

在固定切点拆分风险区间

Stata

stsplit period, at(3 6)

R 包:survival

{ Surv <- survival::Surv; survival::survSplit(Surv(time, event) ~ ., data = data, cut = c(3, 6), start = "start", end = "time", event = "event", episode = "period") }

与 Stata 有差异 固定流程;请明确调整示例列名。返回扩展后的风险区间数据;episode变量是区间序号。

stsum

生存时间的概要

Stata

stsum

R 包:survival

survival::survfit(survival::Surv(time, died) ~ 1, data = data)
另有 1 个示例及替代实现

按组统计人时与失败数

Stata

stsum, by(group)

R 包:stats

stats::aggregate(cbind(person_time = time, failures = event) ~ group, data = data, FUN = sum)

固定流程;请明确调整示例列名。仅提供stsum的部分结果,不计算生存时间分位数。

sttocc

从队列风险集抽取巢式病例对照样本

Stata

sttocc, number(2)

R 包:base

{ cases <- which(data$event == 1); sets <- lapply(seq_along(cases), function(j) { i <- cases[j]; at_risk <- which(data$entry <= data$time[i] & data$time >= data$time[i] & data$id != data$id[i]); controls <- sample(at_risk, min(2L, length(at_risk)), replace = FALSE); out <- data[c(i, controls), ]; out$case <- c(1L, rep(0L, length(controls))); out$set <- j; out$failure_time <- data$time[i]; out }); do.call(rbind, sets) }

固定流程;请明确调整示例列名。示例为无并列失败的单记录队列;每次从风险集抽对照,同一人可出现在多个匹配集。并列失败排序和多区间数据需更完整实现。

stvary

检查受试者内协变量变化及缺失

Stata

stvary x z

R 包:base

lapply(split(data, data$id), function(d) vapply(d[c("x", "z")], function(v) c(varies = length(unique(v[!is.na(v)])) > 1, any_missing = anyNA(v)), logical(2)))

固定流程;请明确调整示例列名。返回逐受试者标记而非Stata汇总表;与stvary一样忽略抽样权重。