使用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')
解决思路
核心问题不是模型类型选错了,而是当前模型没捕捉到数据的非线性趋势,调整方向如下:
给模型加入非线性项
你当前的模型公式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()调整
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')检查模型收敛性
查看summary(model)的输出,确认有没有收敛警告。如果存在收敛问题,可以对VI1做中心化处理(比如scale(VI1)),或者更换优化器(比如optimizer="Nelder_Mead")提升拟合稳定性。
内容的提问来源于stack exchange,提问作者FloLe
相关产品推荐
相关产品推荐

