R语言glm自定义函数summary未拆分显示变量系数问题咨询
问题说明
编写形参接收自变量的自定义glm()函数时,若传入两个变量乘积形式的交互项,模型summary结果仅输出截距和单个合并项的系数,无法拆分展示各变量主效应、交互项的单独系数。
原错误写法代码与运行结果如下:
test_reg <- function(parameters){ glm_model2 <- glm(healing ~ parameters, family = "binomial", data = psa_data) summary(glm_model2) } test_reg(psa_data$gender_m0 * age_centered)
Call: glm(formula = healing ~ parameters, family = "binomial", data = psa_data) Deviance Residuals: Min 1Q Median 3Q Max -2.2323 0.4486 0.4486 0.4486 0.6800 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) 2.24590 0.13844 16.223 <2e-16 *** parameters -0.02505 0.01369 -1.829 0.0674 . --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 426.99 on 649 degrees of freedom Residual deviance: 423.79 on 648 degrees of freedom (78 Beobachtungen als fehlend gelöscht) AIC: 427.79 Number of Fisher Scoring iterations: 5
预期输出为包含截距、gender_m0主效应、age_centered主效应、gender_m0 * age_centered交互项四个系数的结果。
问题原因
原写法中,调用函数时传入的psa_data$gender_m0 * age_centered会在进入函数前先完成向量乘法计算,最终传入函数的是一个计算完成的单列数值向量,glm()会将其识别为单个独立变量,无法识别其背后的两个主效应和交互项结构,因此只会输出单个对应系数。
解决方法
glm()的交互项识别依赖R的特殊公式语法,不能传入提前计算好的乘积值,需要动态构造完整模型公式传入,具体写法如下:
- 改写自定义函数,用
reformulate()动态拼接模型公式,不要直接在公式里写形参名 - 调用函数时传入符合R公式语法的自变量文本,而非提前计算的数值向量
修正后的代码:
test_reg <- function(parameters){ # 动态构造模型公式,响应变量为healing,右侧为传入的自变量项 model_formula <- reformulate(termlabels = parameters, response = "healing") glm_model2 <- glm(model_formula, family = "binomial", data = psa_data) summary(glm_model2) } # 调用时传入公式语法文本,R公式中a*b会自动展开为a + b + a:b(两个主效应+交互项) test_reg("gender_m0 * age_centered")
运行后即可得到包含截距、gender_m0、age_centered、两者交互项共4个系数的summary结果。
注:如果需要传入多个不同的自变量组合,只需要在调用时按R公式的语法写对应项即可,比如传入"gender_m0 + age_centered"就会只跑两个主效应的模型,传入"gender_m0 * age_centered + biomarker"就会自动加入biomarker的主效应。
内容的提问来源于stack exchange,提问作者tonchy
相关产品推荐
相关产品推荐

