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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:24:52