如何修改glm方差分析输出中的变量名称
解决方差分析函数中变量名显示问题
你遇到的问题是因为直接用data[[x]]和data[[y]]构建公式时,模型会把这个表达式当作变量名输出,而非实际传入的列名。可以通过以下两种方式修改函数,让输出显示正确的变量名:
方法一:使用reformulate构建公式
利用reformulate函数将符号转换为标准公式,这样模型会识别数据框中的实际列名:
library(carData) df <- carData::Salaries f <- function(x,y, data){ x <- ensym(x) y <- ensym(y) # 构建响应变量为y、预测变量为x的公式 formula <- reformulate(as.character(x), response = as.character(y)) m <- aov(glm(formula, family='gaussian', data=data)) print(summary(m)) }
执行f(rank, salary, df)后,输出中的变量名会显示为rank:
> f(rank, salary, df ) Df Sum Sq Mean Sq F value Pr(>F) rank 2 1.432e+11 7.162e+10 128.2 <2e-16 *** Residuals 394 2.201e+11 5.586e+08 Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
方法二:使用!!操作符插入符号
在公式中使用!!(强制求值)操作符,将转换后的符号直接插入公式,这是tidyeval框架下的标准做法:
library(carData) df <- carData::Salaries f <- function(x,y, data){ x <- ensym(x) y <- ensym(y) # 用!!将符号替换为实际变量名 m <- aov(glm(!!y ~ !!x, family='gaussian', data=data)) print(summary(m)) }
执行后同样会得到显示正确变量名的输出。
原理说明
ensym(x)将输入的非标准表达式转换为符号,as.character(x)则将符号转为字符串,供reformulate使用。!!操作符的作用是在公式构建时,把符号变量强制替换为它所代表的实际变量名,让模型直接识别数据框中的列,而非data[[x]]这样的表达式。
内容的提问来源于stack exchange,提问作者scott.pilgrim.vs.r
相关产品推荐
相关产品推荐

