如何在for循环输出中显示线性回归模型的自变量名称
问题
给定如下数据集:
structure(list(gender = structure(c(2L, 1L, 1L, 1L, 1L), .Label = c("1", "2"), class = "factor"), Work_less = c(0, 1, 0, 0, NA), happy = c(7, 8, 7, 6, 7), lifestatisfied = c(8, 8, 9, 9, 7), country = c(8, 8, 9, 9, 7)), row.names = c(NA, -5L), class = "data.frame")
尝试用以下代码拟合多个线性模型:
model <- list() for (i in 2:ncol(dat)) { model[[i]] <- lm(lifestatisfied ~ dat[,i], dat) }
但输出中自变量仅显示为dat[, i],而非对应的变量名称,示例输出如下:
[[2]] Call: lm(formula = lifestatisfied ~ dat[, i], data = dat) Coefficients: (Intercept) dat[, i] 8.6667 -0.6667 [[3]] Call: lm(formula = lifestatisfied ~ dat[, i], data = dat) Coefficients: (Intercept) dat[, i] 11.7 -0.5
请问如何修改代码,让输出显示模型对应的自变量名称?
解决方案
问题出在直接在lm的公式中使用dat[,i],R会把这个表达式原样保留,不会解析成对应的变量名。需要动态构建公式对象,让R识别出变量名称。以下是两种可行的方法:
方法1:使用as.formula()构建公式字符串
先获取目标变量的名称,拼接成公式字符串后转换成公式对象:
model <- list() # 获取第2列到最后一列的变量名 var_names <- colnames(dat)[2:ncol(dat)] for (i in seq_along(var_names)) { # 动态生成公式字符串 formula_str <- paste("lifestatisfied ~", var_names[i]) model[[i]] <- lm(as.formula(formula_str), data = dat) # 给列表元素命名,方便后续识别对应模型 names(model)[i] <- var_names[i] }
方法2:使用reformulate()函数(更简洁)
reformulate()可以直接通过变量名生成公式,response参数指定因变量:
model <- list() var_names <- colnames(dat)[2:ncol(dat)] for (i in seq_along(var_names)) { model[[i]] <- lm(reformulate(var_names[i], response = "lifestatisfied"), data = dat) names(model)[i] <- var_names[i] }
修改后,模型输出中的自变量会显示真实名称,比如第一个模型的输出会变成:
$Work_less Call: lm(formula = lifestatisfied ~ Work_less, data = dat) Coefficients: (Intercept) Work_less 8.6667 -0.6667
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

