在R中运行Logistic回归时,如何解决连续数据被当作独立类别处理的问题?
Logistic回归中连续变量被当作分类变量处理的解决方法
问题描述
在R中练习Logistic回归时,连续变量age被当作独立类别处理,每个年龄取值都对应单独的系数,模型输出示例如下:
> Call: > glm(formula = problem ~ age, family = binomial(link = "logit"), > data = train) > > Deviance Residuals: > Min 1Q Median 3Q Max > -2.03933 -1.01077 0.00013 0.90052 1.48230 > > Coefficients: > Estimate Std. Error z value Pr(>|z|) > (Intercept) 1.857e+01 6.523e+03 0.003 0.998 > age19 -1.787e+01 6.523e+03 -0.003 0.998 > age21 -1.857e+01 6.523e+03 -0.003 0.998 > age22 -3.713e+01 7.532e+03 -0.005 0.996 > age23 -1.857e+01 6.523e+03 -0.003 0.998 > age24 -3.684e-07 7.532e+03 0.000 1.000 > age25 -3.679e-07 7.293e+03 0.000 1.000 > age26 -1.857e+01 6.523e+03 -0.003 0.998 > age27 -1.718e+01 6.523e+03 -0.003 0.998 > age28 -1.787e+01 6.523e+03 -0.003 0.998 > age29 -1.897e+01 6.523e+03 -0.003 0.998 > age30 -1.897e+01 6.523e+03 -0.003 0.998 > age31 -1.857e+01 6.523e+03 -0.003 0.998 > age32 -1.857e+01 6.523e+03 -0.003 0.998 > age33 -1.787e+01 6.523e+03 -0.003 0.998 > age34 -1.897e+01 6.523e+03 -0.003 0.998 > age35 -1.772e+01 6.523e+03 -0.003 0.998 > age36 -1.857e+01 6.523e+03 -0.003 0.998 > age37 -1.747e+01 6.523e+03 -0.003 0.998 > age38 -3.651e-07 7.532e+03 0.000 1.000 > age39 -3.644e-07 7.532e+03 0.000 1.000 > age40 -1.857e+01 6.523e+03 -0.003 0.998 > age41 -1.834e+01 6.523e+03 -0.003 0.998 > age42 -1.677e+01 6.523e+03 -0.003 0.998 > age43 -1.885e+01 6.523e+03 -0.003 0.998 > age44 -1.828e+01 6.523e+03 -0.003 0.998 > age45 -3.687e-07 7.532e+03 0.000 1.000 > age46 -1.816e+01 6.523e+03 -0.003 0.998 > age47 -1.816e+01 6.523e+03 -0.003 0.998 > age48 -1.662e+01 6.523e+03 -0.003 0.998 > age49 -1.718e+01 6.523e+03 -0.003 0.998 > age50 -1.926e+01 6.523e+03 -0.003 0.998 > age51 -1.787e+01 6.523e+03 -0.003 0.998 > age52 -3.690e-07 7.532e+03 0.000 1.000 > age53 -3.650e-07 7.989e+03 0.000 1.000 > age54 -3.683e-07 7.532e+03 0.000 1.000 > age55 -3.681e-07 7.989e+03 0.000 1.000 > age56 -3.689e-07 7.532e+03 0.000 1.000 > age57 -3.643e-07 7.293e+03 0.000 1.000 > age58 -3.643e-07 7.532e+03 0.000 1.000 > age59 -3.689e-07 7.293e+03 0.000 1.000 > age60 -3.643e-07 9.224e+03 0.000 1.000 > age62 -3.652e-07 7.989e+03 0.000 1.000 > age63 -3.681e-07 7.532e+03 0.000 1.000 > age65 -3.689e-07 9.224e+03 0.000 1.000 > age66 -3.682e-07 7.293e+03 0.000 1.000 > age68 -3.645e-07 9.224e+03 0.000 1.000 > > (Dispersion parameter for binomial family taken to be 1) > > Null deviance: 247.64 on 199 degrees of freedom > Residual deviance: 180.41 on 153 degrees of freedom > AIC: 274.41 > > Number of Fisher Scoring iterations: 17
用户的预处理及建模代码如下:
#loading packages library(tidyverse) view(rawdata) glimpse(rawdata) str(rawdata) str(id) # Setting data to factors rawdata$sex <- as.factor(rawdata$sex) rawdata$marital <- as.factor(rawdata$marital) rawdata$age <- as.factor(rawdata$age) rawdata$hourwnit <- as.factor(rawdata$hourwnit) rawdata$problem <- as.factor(rawdata$problem) rawdata$stayslprec <- as.factor(rawdata$stayslprec) rawdata$getsleprec <- as.factor(rawdata$getsleprec) glimpse(rawdata) # bar charts ggplot(data, aes(getsleprec, fill = marital)) + geom_bar() + coord_flip() # subsetting data data <- subset(rawdata, select = c(1,2,3,4,15,28,48,49)) newdata <- na.omit(data) newdata view(newdata) str(newdata) train <- newdata[1:200,] test <- newdata[201:241,] # Logistic regression model <- glm(problem ~ hourwnit, family=binomial(link='logit'),data=train) summary(model) view(train)
解决方法
问题出在数据预处理阶段,你将连续变量age转换为了因子类型:
rawdata$age <- as.factor(rawdata$age)
R中glm函数会自动将因子变量当作分类变量处理,为每个类别生成单独的系数。要让age作为连续变量参与回归,需将其转换回数值类型:
1. 转换age为数值型
在构建模型前,执行以下代码(先转字符型再转数值型,避免因子水平编码错误):
rawdata$age <- as.numeric(as.character(rawdata$age))
如果原始age是整数类型,也可以直接使用:
rawdata$age <- as.integer(rawdata$age)
2. 重新构建Logistic回归模型
转换完成后,重新运行模型:
model <- glm(problem ~ age, family=binomial(link='logit'), data=train) summary(model)
此时age会以连续变量形式进入模型,输出中只会有一个对应的系数,代表年龄每增加1单位时,problem发生的对数发生比变化。
额外建议
如果后续分析需要同时保留因子型和数值型的age,可以创建新变量,避免覆盖原始数据:
rawdata$age_num <- as.numeric(as.character(rawdata$age))
这样既不影响其他需要因子型age的可视化或分析,也能在回归中使用连续变量版本。
内容的提问来源于stack exchange,提问作者Matt W
相关产品推荐
相关产品推荐

