为何GLM仅输出部分系数?分类变量各水平系数未显示求助
GLM分类变量各水平系数输出问题解决方案
问题描述
构建包含3个分类变量的二项式GLM时,使用summary()仅得到每个分类变量的单一系数,但期望输出各变量不同水平的系数。以下是相关代码、当前输出与期望输出:
拟合模型代码
binmodel2 <- glm(rate ~ age + sex + ID, family = binomial(), data = irlsuicide, weights = pop) summary(binmodel2)
当前输出
Call: glm(formula = rate ~ age + sex + ID, family = binomial(), data = irlsuicide, weights = pop) Deviance Residuals: Min 1Q Median 3Q Max -6.6223 -1.1460 0.1466 1.5126 6.7728 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -8.35037 0.05919 -141.088 < 2e-16 *** age 0.20536 0.01363 15.067 < 2e-16 *** sex 1.45107 0.04094 35.444 < 2e-16 *** ID 0.01324 0.00449 2.949 0.00319 ** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 2301.66 on 103 degrees of freedom Residual deviance: 506.76 on 100 degrees of freedom AIC: 1017.4 Number of Fisher Scoring iterations: 4
期望输出
Call: glm(formula = rate ~ age + sex + ID, family = binomial(), data = irlsuicide, weights = pop) Deviance Residuals: Min 1Q Median 3Q Max -3.3382 -0.7672 -0.0952 0.6748 3.3815 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -7.83022 0.08297 -94.371 < 2e-16 *** age2 0.77568 0.04544 17.069 < 2e-16 *** age3 0.72427 0.04057 17.851 < 2e-16 *** age4 0.47303 0.04948 9.561 < 2e-16 *** sex1 1.44189 0.04095 35.213 < 2e-16 *** ID2 -0.38530 0.08584 -4.488 7.18e-06 *** ID3 -0.43499 0.15794 -2.754 0.005884 ** ID4 -0.14573 0.14233 -1.024 0.305905 ID5 -0.55167 0.18199 -3.031 0.002434 ** ID6 -0.69006 0.08349 -8.266 < 2e-16 *** ID7 -0.29398 0.09268 -3.172 0.001513 ** ID8 -0.39606 0.10003 -3.959 7.52e-05 *** ID9 -0.34822 0.09127 -3.815 0.000136 *** ID10 -0.36341 0.09868 -3.683 0.000231 *** ID11 -0.15210 0.08645 -1.759 0.078506 . ID12 -0.24432 0.08526 -2.866 0.004161 ** ID13 -0.29089 0.09057 -3.212 0.001320 ** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 2301.66 on 103 degrees of freedom Residual deviance: 163.24 on 87 degrees of freedom AIC: 699.9 Number of Fisher Scoring iterations: 4
解决方案
核心原因是:你的age、sex、ID在数据集里是数值型变量,R默认将其当作连续变量处理,因此summary()只输出单个线性系数。要让R识别为分类变量,需将它们转为因子(factor)类型,有两种实现方式:
方式1:提前将变量转为因子
先修改数据集里的变量类型,再拟合模型:
# 将分类变量转换为因子类型 irlsuicide$age <- factor(irlsuicide$age) irlsuicide$sex <- factor(irlsuicide$sex) irlsuicide$ID <- factor(irlsuicide$ID) # 重新拟合模型 binmodel2 <- glm(rate ~ age + sex + ID, family = binomial(), data = irlsuicide, weights = pop) summary(binmodel2)
方式2:在模型公式中直接转换
无需修改原数据集,在拟合时直接指定变量类型:
# 拟合模型时将变量转为因子 binmodel2 <- glm(rate ~ factor(age) + factor(sex) + factor(ID), family = binomial(), data = irlsuicide, weights = pop) summary(binmodel2)
转换后,R会自动以每个变量的第一个水平作为参考水平,输出其他所有水平相对于参考水平的系数,结果就会和你期望的一致。
内容的提问来源于stack exchange,提问作者Rebeca
相关产品推荐
相关产品推荐

