You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Logistic回归检测概率分析异常:样本量过小还是代码问题?

问题分析与解决建议

首先先指出一个小操作失误:你用了summary.lm(model1)来查看广义线性模型(glm)的结果,这是不对的!glm()生成的是logistic回归模型对象,应该直接用summary(model1)或者summary.glm(model1)——summary.lm()是给普通线性回归(lm)用的,虽然不会报错,但输出的t值不是logistic回归应该关注的统计量(正确的应该是z值和对应的p值),这是第一个需要修正的地方。

接下来看你遇到的核心问题:除截距外,所有自变量的系数估计都极小,p值全为1,这大概率是样本量不足数据本身的结构问题导致的,下面分情况拆解:

1. 样本量与变量数的匹配问题

你提到“样本量极小(n=12),仅约70行数据”,这里大概率是笔误:

  • 如果实际参与拟合的样本真的只有12个,但你在模型里放了7个自变量(包括Substrate的哑变量),样本量远小于变量数,模型的自由度严重不足,根本无法有效估计每个变量的效应,出现这种无意义的参数结果是必然的。
  • 如果是70行原始数据,但因为大量缺失值(比如你数据里Width、DFT有很多NA),用na.exclude排除后实际参与拟合的样本量骤减,也会导致同样的问题。你可以用nrow(model1$model)查看真正参与模型拟合的观测数,确认有效样本量。

2. 数据的分离问题(Separation)

如果有效样本量不算太小(比如30+),那要警惕logistic回归里的完全/准分离问题:当某个自变量的取值能完全区分因变量的两类(比如Substrate为Sand时,P全为0;为Sand&Searass时P有1有0),模型会试图用无穷大的系数来拟合这种完全区分的关系,数值计算时就会表现为系数趋近于0或无穷大,标准误异常大,最终p值接近1。

你可以手动检查每个自变量和P的关系,比如做交叉表(比如table(dframe2$Substrate, dframe2$P)),或者用专门的工具包检测分离问题。

3. 多重共线性问题

如果自变量之间高度相关(比如SGP和SGC可能存在相关性),会导致多重共线性,使得参数估计的标准误变大,结果不稳定,也可能出现类似的无意义p值。可以用方差膨胀因子(VIF)来检测,VIF>5就说明存在严重的共线性问题。


给你的具体建议

  • 先修正操作:用summary(model1)查看正确的logistic回归结果,关注输出里的z valuePr(>|z|),而不是t value
  • 确认有效样本量:运行nrow(model1$model),看看真正用来拟合模型的观测有多少。
  • 如果有效样本量很小:
    • 大幅减少自变量数量,先做单变量logistic回归,筛选出有理论意义且初步显著的变量,再放入多变量模型;
    • 考虑用惩罚性模型,比如LASSO logistic回归(用glmnet包),它能在小样本下处理多个变量,同时做正则化和变量选择,避免过拟合。
  • 如果有效样本量足够:
    • 检测分离问题,若存在,要么去掉导致分离的变量,要么用贝叶斯logistic回归来处理;
    • 检查多重共线性,去掉高度相关的变量;
    • 逐步构建模型:先拟合简单模型,再逐步加入变量,观察结果的稳定性。

内容的提问来源于stack exchange,提问作者Tino

火山引擎 最新活动