所用R包:rms
核心思想
- 节点 (Knots):将连续变量
X
的取值范围划分为多个区间。常见的节点数量是 4 或 5 个,通常放置在分位数上(如 5th, 35th, 65th, 95th)。 - 基函数 (Basis Functions):为每个区间创建一个三次多项式,但有一个关键限制:要求在节点处函数、一阶和二阶导数都是连续的。这确保了整个曲线非常平滑,没有突兀的“拐角”。
- 限制 (Restriction):在首尾两个节点之外的区域,函数被限制为线性。这个限制非常重要,因为它避免了在数据稀疏的尾部出现不可靠的、过拟合的剧烈波动,使得外推更加稳定。
#数据准备
# 假设你的数据框叫 df,因变量是 y,自变量是 x
ddist <- datadist(df) # 为数据框中的所有变量计算分布摘要
options(datadist = "ddist") # 将分布摘要设置为全局选项
# 线性回归模型
fit_ols <- ols(y ~ rcs(x, 4), data = df) # 4 个节点(包括首尾两个)
# 使用 rms 包的 Predict 和 plot 函数
pred <- Predict(fit, x,ref.zero=TRUE) #添加ref.zero=TRUE用于求回归系数 fun=exp 用于求or
plot(pred,
xlab = "Continuous Variable X",
ylab = "Estimate",
main = "Restricted Cubic Spline Plot")
#ggplot2版本
pred_df <- as.data.frame(pred)
ggplot(pred_df, aes(x = x, y = yhat)) +
geom_line(linewidth = 1, color = "blue") +
geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2, fill = "blue") +
labs(x = "Continuous Variable X",
y = "Predicted Outcome Y",
title = "RCS Plot with 95% CI") +
theme_classic()
# 逻辑回归模型
fit_lrm <- lrm(y_binary ~ rcs(x, 4), data = df)
# Cox 比例风险模型
fit_cph <- cph(Surv(time, status) ~ rcs(x, 4), data = df)
pred <- Predict(fit, x, fun = exp, ref.zero = TRUE) # fun = exp 将 log(OR) 转换为 OR
易错点
- 在RCS逻辑回归模型中,β、OR、HR是通过比较预测值与参考点来计算的,而不是通过“减去x-1”的方式。
- 正确的方法是选择一个参考点,然后计算所有x点相对于该参考点的OR。
- pred <- Predict(fit, x, fun = exp, ref.zero = TRUE) # fun = exp 将 log(OR) 转换为 OR
ref.zero = TRUE
会自动设置参考点(通常为中位数),并计算每个x相对于参考点的OR。- 输出中的
yhat
就是OR值,而不是直接预测的概率或log(odds)。