我对变量进行正态性检验后,发现连续变量都是偏态数据,但是我之前按照正态分布计算了logistics回...
생성일: 2025년 11월 3일
생성일: 2025년 11월 3일
我对变量进行正态性检验后,发现连续变量都是偏态数据,但是我之前按照正态分布计算了logistics回归、分层分析、ROC曲线、DCA曲线,我现在怎么办?
先别慌——逻辑回归本身并不要求自变量(连续变量)服从正态分布,ROC 和 DCA 也不依赖这个假设。你大概率不需要推翻重做。更具体地说:
换句话说:偏态≠模型失效。真正需要检查的是“logit 线性”与异常值/影响点。
log1p(x)、sqrt(x)、Yeo–Johnson(允许 0/负值)。r# 1) 基础模型 fit0 <- glm(y ~ x1 + x2 + x3, family = binomial, data = df) # 2) 样条检验 logit 非线性 library(rms) dd <- datadist(df); options(datadist = "dd") fit_spline <- lrm(y ~ rcs(x1, 4) + rcs(x2, 4) + x3, data = df, x = TRUE, y = TRUE) anova(fit_spline) # 非线性成分的显著性 plot(Predict(fit_spline, x1)) # x1 的效应曲线 # 若更偏好简单变换(例如 x1 偏右态): df$lx1 <- log1p(df$x1) fit_tx <- glm(y ~ lx1 + x2 + x3, family = binomial, data = df) # 3) AUC/ROC(经验法,不依赖正态) library(pROC) roc0 <- roc(df$y, predict(fit0, type="response")) roc_tx <- roc(df$y, predict(fit_tx, type="response")) roc.test(roc0, roc_tx, method = "delong") # 比较 AUC # 4) 决策曲线 # install.packages("rmda") library(rmda) d0 <- decision_curve(y ~ x1 + x2 + x3, data = df, family = binomial, thresholds = seq(0, 1, by = 0.01), bootstraps = 0) dtx <- decision_curve(y ~ lx1 + x2 + x3, data = df, family = binomial, thresholds = seq(0, 1, by = 0.01), bootstraps = 0) plot_decision_curve(list(d0, dtx), curve.names = c("原模型","log1p 变换"), standardize = TRUE)
pythonimport numpy as np import pandas as pd import statsmodels.api as sm from patsy import dmatrix from sklearn.pipeline import make_pipeline from sklearn.preprocessing import SplineTransformer, StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score, roc_curve, brier_score_loss from sklearn.model_selection import cross_val_score, StratifiedKFold # 1) 线性项模型 X = df[['x1','x2','x3']].to_numpy() y = df['y'].to_numpy() clf0 = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000)) clf0.fit(X, y) p0 = clf0.predict_proba(X)[:,1] # 2) 样条(自然样条/三次样条)建模 spl = SplineTransformer(degree=3, n_knots=5, include_bias=False) clf_spl = make_pipeline(spl, StandardScaler(), LogisticRegression(max_iter=2000)) clf_spl.fit(df[['x1','x2','x3']], y) p1 = clf_spl.predict_proba(df[['x1','x2','x3']])[:,1] # 3) 比较(AUC、Brier) from sklearn.metrics import roc_auc_score auc0, auc1 = roc_auc_score(y, p0), roc_auc_score(y, p1) brier0, brier1 = brier_score_loss(y, p0), brier_score_loss(y, p1) print(auc0, auc1, brier0, brier1) # 4) Box–Tidwell 风格的线性检验(示例:对 x1) X_bt = df[['x1','x2','x3']].copy() X_bt['x1_logx1'] = (df['x1'] + 1) * np.log(df['x1'] + 1) # 处理 0 值 X_bt = sm.add_constant(X_bt) model_bt = sm.Logit(y, X_bt).fit() print(model_bt.summary()) # 若 x1_logx1 显著 → 线性假设可能不成立
注:不要为“变正态”而变换;变换或样条的目标是让 logit‑x 关系更贴近真实、提升可解释性与预测/校准,而不是满足某个并不需要的“正态”前提。
这样既稳住了你的主要结论,也提高了模型的严谨性与透明度。需要的话,我可以按你现有变量清单,给出每个变量更合适的函数形式(变换或样条的结点数)和一段可直接跑的代码模版。
下面把四张图逐一解读,并给出和你建模相关的结论与建议。
80 岁处出现较大的负偏差,进一步印证右尾偏弱/上界截断。
年龄
BMI
log(BMI) 或 Yeo–Johnson)——目标是改善logit 线性与稳定估计,而不是“凑正态”。模型检查(建议补充在附录/敏感性分析)
描述性统计与组间比较
这是 SPSS 的正态性检验表。左边三列是 Kolmogorov–Smirnov(K‑S,带 Lilliefors 修正),右边三列是 Shapiro–Wilk(S‑W)。
判断规则:一般看 p 值 ≥ 0.05 视为“未拒绝正态”;p < 0.05 视为“偏离正态”。在 n≈224 这样的样本量下,S‑W 通常比 K‑S 更有检出力,两者冲突时优先参考 S‑W + Q–Q 图/直方图。
说明:“0.200*”是 SPSS 的上限显示,表示 p≥0.200;脚注 a 为 Lilliefors 显著性修正。
log/Yeo–Johnson),并检查部分残差/效应曲线。一句话总结:这张表显示多数变量(尤其血糖、血脂、夜/昼间血压、UA)在本样本中呈偏态;但这并不影响你既有的 Logistic/ROC/DCA 结论。把正态性结果当作提示,去检查并修正 logit 线性 与 极端值影响,比“强行变正态”更关键。
先给结论:
优先用 Shapiro–Wilk(S‑W)检验,并配合 Q–Q 图/直方图判断。
K‑S(带 Lilliefors 修正)对“是否正态”的检出力较弱、对尾部不敏感,四张表里多处出现“K‑S 认为正常、S‑W 判为非正态”的情形;在你这种样本量(n≈200–460)的范围内,S‑W 更合适。
两列检验都在做“来自正态总体”的原假设:
左三列 = K‑S(Lilliefors 修正);右三列 = S‑W。显著性(p 值)<0.05 视为“拒绝正态”。
小结:四张表呈现的主要模式是——S‑W 比 K‑S 更容易识别出偏态/长尾;K‑S 经常“漏检”,尤其对肌酐、BMI这类右偏/重尾变量。样本量越大,两个检验对轻微偏离都更敏感,因此必须结合图形(Q–Q、直方图)判断偏离是否有实质意义。
因此:这四张里以 S‑W 为主判断;当 S‑W 与 K‑S 冲突时,以 S‑W + 图形为准。
“连续变量的分布通过直方图与 Q–Q 图进行可视化评估,并采用 Shapiro–Wilk 进行正态性检验(样本量 < 500)。多数变量偏离正态,因此以中位数(IQR)呈现并采用非参数检验;近似正态的变量以均值±标准差呈现并采用 Welch t 检验。Logistic 回归不以自变量正态为前提;为满足 logit 线性,必要时对偏态变量进行了对数/样条处理,并通过效应曲线与似然比检验验证。”
如果你愿意,我可以按你最终入模的变量,给出一段样条或变换的具体代码和结果呈现模板,直接替换到你的分析流程里。
多数变量偏离正态,审稿人最可能得提问是?
下面是当多数连续变量偏离正态时,审稿人最可能问到的重点问题(按出现频率与杀伤力排序),以及你可以直接使用的回答要点/补救动作与稿件写法模板。
可能质疑
回答要点
模板句
“Logistic 回归并不以自变量正态为前提。连续变量的分布通过 Q–Q 图评估;偏态变量在描述性统计中以中位数(IQR)呈现并采用非参数检验。”
可能质疑
回答要点
模板句
“为避免将偏态变量强行假定线性,我们对使用 RCS(5 个结点,位于 5、27.5、50、72.5、95 分位)。非线性成分在上显著(P<0.05),其余不显著。最终模型保留、其余变量线性项。”
可能质疑
回答要点
模板句
“我们检查了影响度(Cook’s D、杠杆值);去除最极端 1% 个体或采用稳健标准误后,系数与 AUC 变化<5%。”
可能质疑
回答要点
模板句
“正态性以 Shapiro–Wilk 与 Q–Q 图综合判断;鉴于样本量较大,统计检验的显著性不作为是否建模的唯一依据。”
回答要点
模板句
“为避免信息损失与人为阈值,我们保留连续尺度并用样条刻画非线性;分组分析作为敏感性验证,方向一致。”
(偏态不影响 AUC,但可能影响概率刻度)
回答要点
模板句
“模型经 1000 次 bootstrap 内部验证:AUC = …,Brier = …,校准斜率 = …,截距 = …;经乐观度校正后报告最终性能。”
可能质疑
回答要点
回答要点
回答要点
回答要点
“连续变量分布通过直方图与 Q–Q 图可视化,并以 Shapiro–Wilk 进行正态性评估。考虑到样本量较大,我们不以正态性检验的显著性作为建模前提。偏态变量在描述性统计中以中位数(IQR)呈现并采用 Mann–Whitney U/Kruskal–Wallis 进行组间比较。
Logistic 回归对自变量正态性无要求,我们重点检验 logit–自变量的线性:对使用 受限三次样条(5 结点:5%、27.5%、50%、72.5%、95%),其余变量以线性项入模。检查了异常值影响(Cook 距离、杠杆值),并做敏感性分析(winsorize 1%/99%/稳健标准误),结论稳定。
ROC 采用经验法(DeLong 置信区间),DCA 使用重抽样得到的预测概率并给出 95% CI,阈值区间按临床可行范围预设。
模型以 1000 次 bootstrap 做内部验证并报告 AUC、Brier、校准斜率/截距与校准曲线。”
做到这些,关于“变量不正态”的审稿质疑基本都能一次性化解,同时还能提升论文的严谨性与说服力。