You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用glmer拟合二项logit模型无法匹配S型数据

问题描述

我尝试为取值为0或1的因变量拟合模型,用glmer拟合二项logit模型后,拟合效果很差(彩色线是原始数据,黑色线是拟合曲线)。但数据呈现明显的S型,我本以为这类模型能得到理想拟合,疑惑是不是用错了模型?

用到的R代码

带随机效应的模型代码

library(lme4)
library(ggplot2)

exdata <- read.csv("https://raw.githubusercontent.com/FlorianLeprevost/dummydata/main/exdata.csv")

model=glmer(VD~ as.factor(VI2)*VI1 + (1|ID),exdata, 
            family=binomial(link = "logit"), 
            control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun=2e5)))
summary(model)
exdata$fit=predict(model, type = "response")

ggplot(exdata,aes(VI1, VD,  color=as.factor(VI2),
                     group=as.factor(VI2))) + 
  stat_summary(geom="line", size=0.8) +
  stat_summary(aes(y=(fit)),geom="line", size=0.8, color="black") +
  theme_bw()

去掉随机效应后的尝试代码

ggplot(exdata, aes(x=VI1, y=VD, color=as.factor(VI2),
                      group=as.factor(VI2))) + 
  stat_summary(fun.data=mean_se, geom="line", size=1)+
  stat_smooth(method="glm", se=FALSE, method.args = list(family=binomial), color='black')

解决思路

核心问题不是模型类型选错了,而是当前模型没捕捉到数据的非线性趋势,调整方向如下:

  1. 给模型加入非线性项
    你当前的模型公式as.factor(VI2)*VI1只设定了VI2分组下VI1的线性效应,但数据是S型的非线性关系,线性项自然拟合不出S型。可以给VI1加入非线性变换,比如自然样条、多项式:
    示例(带随机效应的样条模型):

    library(splines)
    # 用自然样条拟合非线性,df=3适配S型趋势
    model_spline <- glmer(VD ~ as.factor(VI2)*ns(VI1, df=3) + (1|ID), 
                          data=exdata,
                          family=binomial(link="logit"),
                          control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e5)))
    exdata$fit_spline <- predict(model_spline, type="response")
    # 重新绘图对比
    ggplot(exdata,aes(VI1, VD, color=as.factor(VI2), group=as.factor(VI2))) + 
      stat_summary(geom="line", size=0.8) +
      stat_summary(aes(y=fit_spline), geom="line", size=0.8, color="black") +
      theme_bw()
    
  2. 调整stat_smooth的拟合逻辑
    用stat_smooth(method="glm", family=binomial)时,默认拟合的是线性logit模型,同样无法捕捉非线性。换成广义加性模型(GAM)更适合这类非线性趋势:

    library(mgcv)
    ggplot(exdata, aes(x=VI1, y=VD, color=as.factor(VI2), group=as.factor(VI2))) + 
      stat_summary(fun.data=mean_se, geom="line", size=1)+
      stat_smooth(method="gam", se=FALSE, 
                  method.args = list(family=binomial, formula=y~s(x, by=as.factor(VI2))), 
                  color='black')
    
  3. 检查模型收敛性
    查看summary(model)的输出,确认有没有收敛警告。如果存在收敛问题,可以对VI1做中心化处理(比如scale(VI1)),或者更换优化器(比如optimizer="Nelder_Mead")提升拟合稳定性。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:15:49