SAS 生存分析模拟

proportional hazards model
sas
cox
ph
survival
simulation
Author
Published

Thursday, February 13, 2025

生存分析(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),以及不同协变量条件下的生存函数图。

参数估计

生存曲线

完整代码已经上传至星球,感兴趣的同学可以自行查看。