00ae-fe0f

[R 语言]以白血病结局预测为例说明逻辑回归建模(中)

2024/04/30 发布 2024/06/14

一例白血病临床数据的逻辑回归建模和优化(中篇)

前言

临床场景中,很多诊断和预后的结局是二分类的(是或非),比如阳性结果的“发生”和“未发生”。医生需要根据病人身上得到的各类有价值的线索来综合预判最有可能的结果,这就是逻辑回归最常应用的场景。本课时用一组临床的白血病数据集为范例,目标是建立逻辑回归预测模型,预测疾病复发 (remission)。

复发与否就是一个二分类的结局,我们要从数据中找规律,即各个因素(“自变量”)与结局(“因变量”)之间是否存在联系,和联系的强弱。比如,某一个自变量在大部分未复发的病例中都等于1,在大部分复发的病例中都等于5,那这就呈现了一定的关联。这就是逻辑回归通过处理样本数据而帮我们归纳的信息。如果存在联系,逻辑回归就认为这个自变量应该成为预测因子,并根据整个数据集,赋予这个自变量一个系数来表示联系的强弱,那么预测因子的取值乘以相应系数就是对结局产生的作用。对于数据中提供的每个病例,其所有预测因子的作用总和会产生一个最终的预测值(即结局发生的概率,在 0 到 1 之间),逻辑回归尝试最大程度地让预测值符合实际情况,而实际情况也就是现有数据告诉我们的复发和未复发,我们需要将预测值与实际值对比,看模型表现。如果把这个模型拿到当前数据之外的其他数据集,也可以查看其预测表现,这叫做验证。

可以用我们的视频 来理解上述内容,会更加浅显易懂。

回到这节课的任务。当拿到一个现实世界来源的数据,第一步要先做一些清理,比如查找缺失和重复,发现不合理的数值,规范格式等基本操作,才能使数据提供分析价值。然后,根据数据内容做一些浅显的分析(如单因素和多因素分析),进一步查看数据合理性与数据特征,这也叫做探索性数据分析。在这之后,分析人员心中才会对接下来的模型建立有了初步的想法,于是就开始了建模的过程。建好的逻辑回归模型会对,会呈现一系列参数来说明它的表现。接下来讲解这些内容。

共分三篇:

学习目标:

a. 根据原始数据,以 “REMISS” (复发)为结局,用其他变量预测结局,优化模型

b. 批判地理解并尝试逐步回归选择法、LASSO 回归

c. 评价模型的主流方法,熟悉模型诊断 (model diagnostics)

d. 理解并比较几种拟合优度检验 (Goodness-of-Fit tests)


本课时相关资源:

高校资源

经典书籍

人工智能 R 语言工具

其他见文中附超链接

以上资源并非生硬搬运,而是以一种注重读者理解的方式融合、发散性地呈现。


下面开始正文:


1,2,3 部分的内容见 “上篇”

4. 建模和模型诊断

建模与模型诊断是平行的过程,因为要不断通过一系列衡量标准来查看模型表现,调整优化,才能最终建立模型。上篇的 p 值,置信区间,优势比 OR,AIC 等衡量模型的参数。模型诊断则衡量模型的整体表现和暴露问题。

4.1 R 方

R 方表示模型可以解释数据变异的程度。比如对于符合线性趋势的数据集,线性方程可以最佳地解释它的变异。所以,R 方如果越接近 1 (解释了 100%),说明拟合度越高。R 方的“好坏”没有界定,要看具体问题。它可以用来比较不同模型拟合度。我们在“下篇”拟合优度有对 R 方的更多讲解。

由于线性回归的 R 方计算方式不能直接适用于逻辑回归,所以叫做“伪 R 方” (pseudo McFadden’s R-squared),实际上是将逻辑回归曲线做了“拉直”变换。

如何计算 R 方?首先,我们需要让 R 知道零模型,因为对比的参照物是零模型。然后,用伪 R 方的 R 语言计算公式:

R squared = 1 - as.numeric(logLik(proposed_model_deviance)/logLik(null_model_deviance))

其中,proposed_model 是任何我们需要计算伪 R 方的模型(本例是纳入所有变量的full_model),null_model 是零模型,零模型中没有任何变量,可以理解为是一个常数 (constant),在坐标中就是 y=constant。Deviance 可以理解为 “BADNESS of fit”,呼应了 R 方可以衡量 “GOODNESS of fit” 的属性。

本例中 null_model 是 1:

null_model <- glm(REMISS ~ 1, data = leukemia, family = binomial)
r_squared_full <- 1 - as.numeric(logLik(full_model)/logLik(null_model))
r_squared_full

单个伪 R 方的数值意义不大,而需要留作和其他模型比较:

## [1] 0.3717562 

补充一些 R 方的拓展知识

(hellomedstat 翻译)之所以称为 R 方,是因为在简单回归模型中,它只是因变量和自变量之间相关性的平方,通常用 ”r" 表示。 在多元回归模型中,R 平方由所有变量之间的成对相关性决定,包括自变量之间以及与因变量之间的相关性。 在后一种情况下,R 方的平方根称为 “多重 R”,等于因变量实际值与模型预测值之间的相关性。 (注意:如果模型不包含常数,即所谓的 “原点回归”,那么 R 平方的定义就不同了)。

想要加强对 R 方的理解,也可以看 Josh Starmer 关于伪 R 方的生动解释,可搜索视频"R-squared, Clearly Explained!!!"

4.2 共线性 (multi-collinearity) 计算和相应处理

查看过 full_model 的基本表现,还要检查是否存在“上篇” 提到的共线性 (collinearity)。共线性的存在会使 OR 的置信区间显著增大,显著降低模型稳定性,也不利于精简模型。

有两种方法计算共线性,容许度 (tolerance)方差扩大因子 (Variance Inflation Factor, VIF) 来计算共线性程度,两者本质互为倒数。方差扩大因子代表共线性导致方差扩大的程度。

用 R 包 car 中的 vif() 计算各自变量的方差扩大因子:

library(car)
vif(full_model)
##       CELL      SMEAR      INFIL
##  62.463539 434.423427 471.097597
##         LI      BLAST       TEMP
##   4.431189   4.176061   3.014554

如何处理共线性?时常看到建议去掉 VIF 大于 10 或大于 5 的变量,我们在预审论文时也发现这样的错误操作。实则应该先去掉一部分 VIF 较大的变量(而不是全部!),再重新计算 VIF,这时很可能原本偏大的 VIF 会回到满意的范围。

同时要注意,去掉变量需要有现实意义的考量。所以,我们从 SMEAR 和 INFIL 这两个变量来考虑,因为我们之前看到它俩存在高度的线性相关性,且临床知识会告诉我们,这两者都和骨髓中白血病细胞浸润情况有关。

所以我们去掉 INFIL(也可以是 SMEAR),新的模型起名叫 rmv_infil_model,再重新计算:

rmv_infil_model <- glm(REMISS ~ CELL + SMEAR + LI + BLAST + TEMP, data = leukemia, family = binomial)
summary(rmv_infil_model)
##
## Call:
## glm(formula = REMISS ~ CELL + SMEAR + LI + BLAST + TEMP, family = binomial,
##     data = leukemia)
##
## Coefficients:
##             Estimate Std. Error z value
## (Intercept)  76.8542    69.7349   1.102
## CELL         11.6385    10.3447   1.125
## SMEAR         1.2592     3.6398   0.346
## LI            4.3120     2.5329   1.702
## BLAST        -0.2452     2.1824  -0.112
## TEMP        -94.4213    75.2384  -1.255
##             Pr(>|z|)
## (Intercept)   0.2704
## CELL          0.2606
## SMEAR         0.7294
## LI            0.0887 .
## BLAST         0.9106
## TEMP          0.2095
## ---
## Signif. codes:
##   0 '***' 0.001 '**' 0.01 '*' 0.05 '.'
##   0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
##     Null deviance: 34.372  on 26  degrees of freedom
## Residual deviance: 21.748  on 21  degrees of freedom
## AIC: 33.748
##
## Number of Fisher Scoring iterations: 7

计算这时的各变量 VIF 值,现在所有变量的 VIF 都小于 5 了:

vif(rmv_infil_model)
##     CELL    SMEAR       LI    BLAST
## 2.565933 1.559088 4.118593 3.823554
##     TEMP
## 2.743373

感兴趣的读者可以再了解另一种处理共线性的方式,它适用于由两个自变量叠加形成的交互项 (interaction terms) 引起的共线性。这种方法会将交互项中涉及的两个变量做 “中心化处理” (center the variable)。 (链接中有一个案例,页面内搜索“center the variable”)

作为习惯,也计算一下这个新模型的伪 R 方,发现几乎没有变化:

r_squared_rmv <- 1 - as.numeric(logLik(rmv_infil_model)/logLik(null_model))
r_squared_rmv
## [1] 0.3672637

5. 变量筛选

为什么要选择变量?因为我们追求一个好的模型,需要衡量实用性、准确性、精简度。变量太多会导致应用要求高,将低泛化能力 (generalizability),增加**过度拟合 (overfitting)**风险。

除了用 vif 和医学学科知识来去掉不重要的、有共线性的变量,如果还需要进一步减少变量,有若干种方法。对于本例,其实缺乏充分的理由筛选变量,因为样本量很小,变量也不多。但我们仅仅为了呈现方法而做一次筛选,所以选择最经典的逐步回归法做一次示范。

5.1 逐步回归法变量筛选

有“向前”和“向后”两种逐步回归: “向前”法一般是从只包含一个变量的简单模型作为起始。我们将 LI 纳入这个简单模型,因为多因素分析中,LI 的 p 值最小,所以是当下最合理的选择;“向后”法是从所有变量 (full_model) 开始。两种均以降低 AIC 为目标增减变量。

虽然经典,但这种方法存在缺点和争议,而且它仅仅根据现有数据内部的关联性来选择变量,是纯粹的数据驱动 (data-driven) 法,而非基于应用场景的理论知识 (theory-based) 法。其筛选原理是利用 AIC 值 (AIC-based)。前面还说过,基于 AIC 的方法计算速度相当快(因为它没有穷尽所有候选模型),而且可以处理复杂的模型公式,包括交互项 (interaction terms)。

simple_model 表示只有 LI 为自变量的简单模型,full_model 代表纳入所有自变量的模型,见下:

simple_model <- glm(REMISS ~ LI, data = leukemia, family = binomial)
summary(simple_model)
##
## Call:
## glm(formula = REMISS ~ LI, family = binomial, data = leukemia)
##
## Coefficients:
##             Estimate Std. Error z value
## (Intercept)   -3.777      1.379  -2.740
## LI             2.897      1.187   2.441
##             Pr(>|z|)
## (Intercept)  0.00615 **
## LI           0.01464 *
## ---
## Signif. codes:
##   0 '***' 0.001 '**' 0.01 '*' 0.05 '.'
##   0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
##     Null deviance: 34.372  on 26  degrees of freedom
## Residual deviance: 26.073  on 25  degrees of freedom
## AIC: 30.073
##
## Number of Fisher Scoring iterations: 4

将“向后”法得到的模型起名为 backstep_model:

backstep_model <- step(full_model, direction = "backward")
## Start:  AIC=35.59
## REMISS ~ CELL + SMEAR + INFIL + LI + BLAST + TEMP
##
##         Df Deviance    AIC
## - BLAST  1   21.594 33.594
## - INFIL  1   21.748 33.748
## - SMEAR  1   21.765 33.765
## - CELL   1   22.010 34.010
## <none>       21.594 35.594
## - TEMP   1   23.871 35.871
## - LI     1   26.354 38.354
##
## Step:  AIC=33.59
## REMISS ~ CELL + SMEAR + INFIL + LI + TEMP
##
##         Df Deviance    AIC
## - INFIL  1   21.761 31.761
## - SMEAR  1   21.776 31.776
## - CELL   1   22.022 32.022
## <none>       21.594 33.594
## - TEMP   1   24.198 34.199
## - LI     1   30.276 40.276
##
## Step:  AIC=31.76
## REMISS ~ CELL + SMEAR + LI + TEMP
##
##         Df Deviance    AIC
## - SMEAR  1   21.878 29.878
## <none>       21.761 31.761
## - TEMP   1   24.292 32.292
## - CELL   1   24.667 32.667
## - LI     1   30.485 38.485
##
## Step:  AIC=29.88
## REMISS ~ CELL + LI + TEMP
##
##        Df Deviance    AIC
## <none>      21.878 29.878
## - TEMP  1   24.341 30.341
## - CELL  1   24.817 30.817
## - LI    1   30.861 36.861

将“向前”法得到的模型起名 fwdstep_model:

fwdstep_model <- step(simple_model, direction = "forward")
## Start:  AIC=30.07
## REMISS ~ LI

还可以将选择“both”:

stepwise_model <- step(full_model, direction = "both") 
## Start:  AIC=35.59
## REMISS ~ CELL + SMEAR + INFIL + LI + BLAST + TEMP
##
##         Df Deviance    AIC
## - BLAST  1   21.594 33.594
## - INFIL  1   21.748 33.748
## - SMEAR  1   21.765 33.765
## - CELL   1   22.010 34.010
## <none>       21.594 35.594
## - TEMP   1   23.871 35.871
## - LI     1   26.354 38.354
##
## Step:  AIC=33.59
## REMISS ~ CELL + SMEAR + INFIL + LI + TEMP
##
##         Df Deviance    AIC
## - INFIL  1   21.761 31.761
## - SMEAR  1   21.776 31.776
## - CELL   1   22.022 32.022
## <none>       21.594 33.594
## - TEMP   1   24.198 34.199
## + BLAST  1   21.594 35.594
## - LI     1   30.276 40.276
##
## Step:  AIC=31.76
## REMISS ~ CELL + SMEAR + LI + TEMP
##
##         Df Deviance    AIC
## - SMEAR  1   21.878 29.878
## <none>       21.761 31.761
## - TEMP   1   24.292 32.292
## - CELL   1   24.667 32.667
## + INFIL  1   21.594 33.594
## + BLAST  1   21.748 33.748
## - LI     1   30.485 38.485
##
## Step:  AIC=29.88
## REMISS ~ CELL + LI + TEMP
##
##         Df Deviance    AIC
## <none>       21.878 29.878
## - TEMP   1   24.341 30.341
## - CELL   1   24.817 30.817
## + SMEAR  1   21.761 31.761
## + INFIL  1   21.776 31.776
## + BLAST  1   21.869 31.869
## - LI     1   30.861 36.861

我们计算这三个自变量组成的模型的 R 方,和前面的模型相比几乎没有变化:

r_squared_step <- 1 - as.numeric(logLik(stepwise_model)/logLik(null_model))
r_squared_step
## [1] 0.3634951

由于样本量太小,R 方没有变化并不能说明什么问题。

注意,上述向前和向后逐步回归法给出了不同的结果。向后法最终变量是 CELL,LI,TEMP。

如果 R 方和 AIC 都没有明显变化,如何比较模型呢?首先需要增加样本量,这些衡量值才可能会产生显著的变化,问题也能部分解决 -- 一切数据驱动的方法自然会依赖大样本,在大样本和待选变量较多 (candidate variables) 的情况下会呈现优势。

但是无论样本量大小,都要将 专家意见(expert opinion) 首先纳入考虑,这里的专家是指医学、临床领域的。还要依靠 内部&外部验证 (internal & external validation) 来衡量比较。

5.2 筛选后模型的回归系数和变量优势比

假设现在决定选择 REMISS ~ LI 这一模型,计算 simple_model 中 LI 的优势比 OR 和它的 95% CI。以下 R 代码中,exp(x) 代表自然常数 e 的 x 次方,coef() 就等于逻辑回归函数中某个自变量的回归系数, “[2]” 代表第二个变量即 LI 的系数。

所以,exp(coef()[2]) 在逻辑回归中第二个自变量 LI 的优势比 OR:

exp(coef(simple_model)[2]) # odds ratio = 18.12449
##       LI
## 18.12449
exp(confint.default(model.2)[2,]) # 95% CI = (1.770284, 185.561725)
##      2.5 %     97.5 %
##   1.770284 185.561725

对 OR = 18.12449 的理解为:LI 每变化一个单位 (unit),得到复发诊断的几率翻了 18.1245 倍。另外,无论 OR 等于多少,其 CI 区间不跨越 1 的话就能说明“优势”有 95% 的概率是存在的。

但是,由于 LI 只有 [0, 2] 的取值范围,且考虑到它代表“骨髓白血病细胞百分比标记指数”,所以 LI 每 0.1 的变化更有临床意义。故而计算其 0.1 变化量的 OR 为 1.336,计为 exp(0.1^β1),这将是我们向模型应用者解释其现实意义的一个重要方面。

5.3 数据可视化即作图

另一个重要的呈现环节是数据可视化,呈现给观众和使用者。生成一个散点图 (scatterplot) 体现 REMISS 和 LI 的关系,再给他们加上一条逻辑回归拟合曲线。

用 plot 生成散点图,函数里的 panel.last = lines 是用来增加拟合曲线:

plot(x=LI, y=REMISS,
     panel.last = lines(sort(LI), fitted(model.2)[order(LI)]))

REMISS_LI.png

本例还可以通过 ggplot() 来体现模型预测能力。我们选择一种经典方式,即将预测值 (predicted probabilities) 与实际结果 (actual outcomes) 的分布做散点图。

做预测值/实际结果图的精髓是:将需要作图的数值(横、纵坐标数据)先赋给一个数据框 (data frame),从而将数据打包传递给 gglpot 函数:

# 先准备好数据框来将横纵坐标值“打包”

predicted_probabilities_stepwise <- predict(stepwise_model, type = "response") # 定义纵坐标

plot_leukemia_stepwise <- data.frame(Actual = as.numeric(leukemia$REMISS), PredictedProb = predicted_probabilities_stepwise)

# 把数据框赋给 ggplot,再自定义一些参数决定可视化的效果

ggplot(plot_leukemia_stepwise, aes(x = Actual, y = PredictedProb)) +
  geom_jitter(alpha = 0.5) +
  labs(x = "Actual Outcome", y = "Predicted Probability")

plot_stepwise.png
这张图可以看出,大部分预测值较小的点都落在实际值为0的区域。

解释一下上述代码里的 "jitter"。因为 actual outcome 只有 0 和 1,为了避免作图后大量数据点聚在一起,jitter 功能让它们在一定范围内做“布朗运动”(hellomedstat 做出的解释)。这样,数据点在横坐标方向上的一定距离内(本例为0.5)散开,所以读图时要注意他们并不代表真正的横坐标值。另外如果数据集很大,有很多点,而这些点也可能会“挤”在一起,那么 jitter 也特别有用。

(关于 ggplot 具体的语法和强大的功能,有非常多的学习资源,大家不必要焦虑会不会用,等到需要用的时候再去学完全来得及。我们要让工具服务于我们,而不是我们服务于工具)

继续用 ggplot 看一下 full_model 对应的散点图:

predicted_probabilities_full <- predict(full_model, type = "response")

plot_full_model <- data.frame(Actual = as.numeric(leukemia$REMISS), PredictedProb = predicted_probabilities_full)

ggplot(plot_full_model, aes(x = Actual, y = PredictedProb)) +
  geom_jitter(alpha = 0.5) +
  labs(x = "Actual Outcome", y = "Predicted Probability by full_model")

plot_full.png
_这张图也能看出大部分预测值较小的点都落在实际值为0的区域。

从散点图来看,两个模型表现没有显著区别。这再一次说明,由于样本量太小,我们得不出什么可靠的结论。但是根据 EPV (event per variable) 这一约定俗成 (rule of thumb),样本中占较小比例的结局数量(也有说事件发生数量)决定了逻辑回归模型最多能够纳入的变量数,两者之比一般要大于 10 :1。本例的 REMISS 作为因变量有两个取值 0 和 1,结局为 1 的数量是 6,结局为 0 的数量是 21,所以 6 决定了最多只能纳入一个自变量,此时 EPV=6。

如何理解这张散点图?

  • 数据点
    图表上的每个点代表数据集中的一个观测值 (observation)。Y 轴上的位置表示模型对该观察结果的预测概率,X 轴上的位置表示实际结果。

  • 与 0 和 1 的一致情况
    理想情况下希望看到实际结果为 1 的观测值具有较高的预测概率(更接近 1),而实际结果为 0 的观测值具有较低的预测概率(更接近 0)。

  • 数据点分离情况
    如果模型表现良好,会看到两个实际结果的点之间有明显的分隔 (seperation)。实际结果 1 的点应集中在预测概率标尺的高端,而实际结果 0 的点应集中在低端。

  • 数据点的集中
    在某些预测的概率水平上出现大量的集中点 (concentration),可能表明模型对这些预测非常确定。反之,如果在某一实际结果水平上的点分布很广,则可能表明模型预测的不确定性 (uncertainty) 或可变性 (variability)。

6. 有争议的数据驱动变量筛选

变量选择不是强制的。 认为必须抛弃一些变量的想法其实是错误的。实际上,除非有充分的理由抛弃变量,否则不要这样做!建议像本例一样,先输入所有相关变量查看全体参数, 用 p 值来帮助解释,而不是用来丢弃变量。

不显著的 p 值并不意味着应该剔除某个变量,它只意味着当前数据没有给出明确的证据证明该回归系数不为零。用 p 值筛选变量是一种 data-driven approach,背后的筛选依据不需要任何学科的理论 (theory-based approach)。除了逐步回归法,常用的数据驱动方法还有 LASSO 回归。

6.1 LASSO Regression 介绍

LASSO 是指 Least Absolute Shrinkage and Selection Operator。感兴趣的读者可以搜索 Josh Starmer 的视频 LASSO Regression 来快速理解。用 LASSO 缩小回归系数至 0 的过程叫做 LASSO shrinkage。

Lasso 法的思想在于设定一个 **penalty (惩罚) **来让原来的模型拟合度变差,所以自然会有一个“惩罚”的力度大小 - 即体现在 Lasso 的超级参数 (hyper-parameter) 惩罚项 λ (lambda) 的数值。

λ 的大小需要基于对原始数据的计算,得到 ”best λ” 之后就可以用 glmnet() 函数来实现。λ 值一旦确定,LASSO 就会一路缩减到底,我们不能自定义想要得到的自变量的数量。但是当 λ 值越大,正则化的程度越高,从而使更多的系数趋于零。相反,λ 值越小,正则化效应越小,从而允许更多变量的系数不为零。缩减后的回归系数大小可以理解为自变量“重要性”(数据层面,非现实层面)。

关于 Lasso 回归和 Ridge 回归 (L1 正则化和 L2 正则化),我们也有相关视频课,主要是帮助大家有效理解和运用,而不是详尽解释背后的算法。本例用 LASSO 做一次示范运算。运算会有警示信息出现,是因为样本量太小导致。But anyway, let's do it for the sake of learning something new...

将所有自变量赋给一个矩阵,并定义结局 y,要求结局是分类变量 (as.factor):

library(glmnet)

x <- as.matrix(leukemia[, c("CELL", "SMEAR", "INFIL", "LI", "BLAST", "TEMP")])
y <- leukemia$REMISS
y <- as.factor(y)

通过 cross-validation 算出最佳的lambda,再得到变量筛选的结果:

cv_fit <- cv.glmnet(x, y, family = "binomial", alpha = 1) 
best_lambda <- cv_fit$lambda.min
lasso_model <- glmnet(x, y, family = "binomial", alpha = 1, lambda = best_lambda)

来看一下这个模型的自变量和系数:

coef(lasso_model)
## 7 x 1 sparse Matrix of class "dgCMatrix"
##                    s0
## (Intercept) -2.186730
## CELL         .
## SMEAR        .
## INFIL        .
## LI           1.430214
## BLAST        .
## TEMP         .
summary(lasso_model)
##            Length Class     Mode
## a0         1      -none-    numeric
## beta       6      dgCMatrix S4
## df         1      -none-    numeric
## dim        2      -none-    numeric
## lambda     1      -none-    numeric
## dev.ratio  1      -none-    numeric
## nulldev    1      -none-    numeric
## npasses    1      -none-    numeric
## jerr       1      -none-    numeric
## offset     1      -none-    logical
## classnames 2      -none-    character
## call       6      -none-    call
## nobs       1      -none-    numeric

总之,LASSO 法认为只有 “LI” 对 “REMISS” 的预测有 “显著性”。所有其他变量的系数都被缩减为零,从而被去除。这种模型简化有助于了解哪些变量在预测结果中最重要。

但它是一种并非基于学科知识的数据驱动法,所以 Lasso 所选择的变量并不一定是 “真实” 或 “因果” 变量,尤其是在可能存在混杂因素的观察性研究中。选择的依据是手头的数据和由于应用惩罚而采取的特定正则化路径 (regularization path)。所选变量应接受进一步验证,并要学科知识中站住脚。

另外,我们也有视频课程介绍 LASSO 和 Ridge 回归。

以上为中篇的全部。恭喜你又进阶了!!之后的下篇会以这个白血病案例为基础专门讲几种拟合优度的理解和比较,包括 Hosmer-Lemeshow 检验。

学习建议


我们详细的项目解析,除了融合最实用的 R 语言代码和最前沿的统计学解释,更强调相应的医学背景!!我们希望让不同的学科背景的读者都能够“知其然,知其所以然”,真正明白每一步“为什么那么做”、”下次我自己会如何实现“。

同时为了大家能够更加习惯学术英文的使用,确保关键词汇遵循学术使用习惯,并且能直接用在学术写作中,我们在一些关键部分使用了中英双语注解。
建议加入我们的互助社群,可以帮助你进行临床医学研究设计,论文预审,R 语言安装和运行答疑;还可以获取课程的 RMD/MD 文件,以便直接复制到自己电脑上操作学习。


关于 R 语言学习,大家不必焦虑,更不要啃下一本教程 - Preparation isn't readiness!

无论学习还是使用 R,应该在遇到实际问题时用高效的人工智能辅助,可以广泛利用开发好的资源,比如找代码模板,甚至 “开口要” —— 去问 GPT 描述需求获取代码框架已经成为可能。

又比如公益在线工具 RTutor:将数据上传至 RTutor,用自然语言(中英文皆可)告诉它想要做什么数据处理,它会返回代码和结果,并且可以根据结果追问。以此为基础再针对性解决出现的问题。把使用和学习 R 语言放在解决实际问题的过程中才是最高效的。而类似 R 语言教程可以作为词典辅助使用。
hellomedstat 所有平台同名。
微信:Positivism_y
QQ 群:760447631
邮箱:hellomedstat@gmail.com

  • R方又叫决定系数(coefficient of determination)。
    其他评估模型的参数有均方根误差(RMSE)最常用,但仅能比较误差是相同单位的模型;相对平方误差(RSE)可以比较误差是不同单位的模型;平均绝对误差(MAE)仅能比较误差是相同单位的模型;相对绝对误差(RAE)。

    2024-05-12 00:56:57