在生信分析任务中,我们常常面临这样的问题:
给定一组样本的基因表达信息,能否预测它们属于疾病组还是对照组?
这种问题,本质上就是一个典型的二分类任务 ——每个样本要么是“0”(正常),要么是“1”(疾病)。在众多有监督的方法里,逻辑回归(Logistic Regression)是最基础、最经典、同时也是最常用的一个。它的思想简单且明确:
通过一个线性组合,将基因表达与样本分类联系起来
再利用一个 S 形函数(Sigmoid) 把结果转化为概率
最终输出的概率就能告诉我们,一个样本更像是“疾病”还是“正常”
逻辑回归不仅能完成分类任务,还能提供特征的可解释性,逻辑回归的系数能反映基因对分类结果的贡献,从而帮助我们找到可能与疾病发生相关的候选基因,揭示潜在的生物学机制。
模型原理
Step1:线性组合
基因表达量就是每个样本的特征,首先把所有基因的表达量加权组合,构建一个线性模型。


Step2:非线性变换(Sigmoid 函数)
问题来了,计算出来的Z可以是任意实数(-∞ ~ +∞),但我们需要一个概率,必须落在 [0,1] 之间,所以,我们用一个 S 形函数 (Sigmoid) 来把它转化为概率:

Sigmoid 的形状:
当 z→+∞,输出接近 1(样本更可能是疾病)。
当 z→−∞,输出接近 0(样本更可能是正常)。
当 z=0,输出正好 0.5(模型不确定)
Step3:模型训练
通过最大化似然函数(Maximum Likelihood Estimation, MLE),找到一组最合适的 β 系数,让疾病样本的预测概率尽可能接近 1,正常样本的预测概率尽可能接近 0。
建立完模型之后,此时输入一个新的样本,根据基因表达,计算出Z值,转换成预测概率,然后通常我们会设定一个阈值(默认为0.5)
如果概率 ≥ 0.5 → 预测为疾病组 (1)
如果概率 < 0.5 → 预测为正常组 (0)
根据逻辑回归模型的β参数,不仅能预测新的样本标签,还能解释基因的意义
β参数>0:说明该基因表达升高会增加患病概率
β参数<0:说明该基因表达升高会降低患病概率
β参数越大,说明该基因在分类中越重要
代码实现
进行训练的数据,每一行是一个样本,每一列是基因的表达值,然后需要有一列Group,告诉模型每个样本属于那一组

训练完模型之后,想用模型对新数据进行预测,切记输入的数据需要有相同的基因列名(顺序不重要,但列名必须对应)!!!
# 逻辑回归fit <- glm(group ~ ., data = expr, family = binomial)# 用模型进行预测#相同的基因列名(顺序不重要,但列名必须对应)prob <- predict(fit, newdata = new_sample, type = "response")# 按阈值分类pred <- ifelse(prob > 0.5, "trt", "untrt")table(Predicted = pred, Actual = expr$group)#查看基因系数library(ggplot2)coef_df <- data.frame(Gene = names(coef(fit))[-1],Estimate = coef(fit)[-1])ggplot(coef_df, aes(x=reorder(Gene, Estimate), y=Estimate, fill=Estimate > 0)) +geom_bar(stat="identity") +coord_flip() +labs(title="Logistic Regression Coefficients", y="Coefficient (log-odds)"

根据这个图,ENSG00000134686系数最大,说明他是trt组(疾病组)影响最大,反之ENSG00000179094是untrt组的强标记,我演示的数据只有8个样本,但是我用了十个基因,所以有些基因的系数不收敛,所以是NA,优化绘图如下:
