生存分析(Survival Analysis)是统计学中用于分析事件发生时间的研究方法。在生存分析中,常常使用比例风险模型(Proportional Hazards Models),例如 Cox 回归模型,来探索影响生存时间的因素。
这里,我们将深入解析如何使用 SAS 进行生存分析模拟,特别是如何生成符合特定假设的生存数据,并使用 Cox 回归模型进行分析。
1. 生存数据模拟
在生存分析中,数据的模拟是研究者进行仿真实验、理解模型行为以及验证方法的重要步骤。以下代码展示了如何使用 SAS 模拟符合指数分布(Exponential Distribution)和 Weibull 分布的生存数据。
指数分布与 Cox 回归模型
指数分布是生存数据中常见的一种分布模型,尤其适用于模拟没有明显时间变化的基线风险(constant baseline hazard),其形式为:
\[ \lambda(t) = \lambda_0 \]
其中,\(\lambda_0\) 是基线风险,它在整个时间范围内保持不变。对于 Cox 回归模型来说,基线风险函数并未指定,而是通过比例风险的假设,估计与协变量相关的风险比(hazard ratio)。
%macro RandExp(sigma);
((&sigma) * rand("Exponential"))
%mend;
在这段代码中,我们定义了一个宏 RandExp,它用于生成指数分布的随机数。rand("Exponential")
生成一个符合指数分布的随机数,而 &sigma 为分布的尺度参数。这里我们通过宏将其封装,方便后续的调用。
接下来,我们创建一个包含100个观测值的数据集 PHData,该数据集模拟了一个包含固定效应(例如协变量 x1 和 x2)和随机事件时间(t)的数据集。
do i = 1 to &N;
xx1{i} = rand("Normal"); xx2{i} = rand("Normal");
end;
baseHazardRate = 0.002; /* 事件发生的基线风险 */
censorRate = 0.001; /* 被删失(censoring)的风险 */
do i = 1 to &N;
x1 = xx1{i}; x2 = xx2{i};
eta = -2*x1 + 1*x2; /* 线性预测变量 */
tEvent = %RandExp( 1/(baseHazardRate * exp(eta)) ); /* 根据线性预测模拟事件时间 */
c = %RandExp( 1/censorRate ); /* 被删失时间 */
t = min(tEvent, c); /* 事件时间或删失时间 */
censored = (c < tEvent); /* 是否删失的指示变量 */
output;
end;
在这部分代码中,我们首先通过 rand(“Normal”) 生成了两个标准正态分布的随机变量 x1 和 x2 作为协变量。然后,我们使用这些协变量和基线风险来计算事件的时间(tEvent)和删失时间(c)。每个观察值的事件时间 t 是事件时间和删失时间中的较小值,而 censored 变量则指示该观测是否为删失。
2. 使用Cox回归模型进行分析
生成生存数据后,我们可以使用 SAS中的 PHREG 拟合比例风险模型。在我们的例子中,我们将使用 Cox 回归模型来估计协变量 x1 和 x2 对生存时间的影响。
ods graphics on;
proc phreg data=PHData plots(overlay CL)= (survival);
model t*censored(1)= x1-x2;
ods select CensoredSummary ParameterEstimates
ReferenceSet SurvivalPlot;
run;
这里运行结果将提供Cox回归模型的参数估计,包括协变量的风险比(Hazard Ratios),以及不同协变量条件下的生存函数图。
完整代码已经上传至星球,感兴趣的同学可以自行查看。