R语言中用for循环实现多组变量一元线性回归及报错解决
解决循环执行多国GDP-消费回归的报错问题
错误根源
- 你在
dynlm(j ~ i)中直接使用字符串变量i和j,R会将其视为字符向量本身,而非从mg.ts中提取对应列的数据,导致字符被当作因子处理,触发对比项错误。 - 你的
y向量存在笔误,将消费变量写成了GDP变量(比如usagdp),会导致变量不匹配。
修正后的循环实现代码
先修正变量名,再正确构建回归公式,同时将结果存储到dataframe:
# 修正变量列表,确保GDP和消费一一对应 x_vars <- c("pakgdp", "belgdp", "usagdp") # 补全其余国家GDP变量 y_vars <- c("pakcons", "belcons", "usacons") # 对应国家的消费变量 # 初始化空数据框用于存储结果 coef_results <- data.frame( country = character(), intercept = numeric(), gdp_coefficient = numeric(), r_squared = numeric(), stringsAsFactors = FALSE ) # 遍历每个国家的变量对(非嵌套循环,一对一匹配) for (idx in seq_along(x_vars)) { # 提取国家标识与对应变量 country <- substr(x_vars[idx], 1, 3) gdp_col <- x_vars[idx] cons_col <- y_vars[idx] # 正确构建回归公式:拼接字符串并转为formula对象 reg_formula <- as.formula(paste(cons_col, "~", gdp_col)) # 执行动态线性回归 reg_model <- dynlm(reg_formula, data = mg.ts) reg_summary <- summary(reg_model) # 提取关键结果 intercept_val <- reg_summary$coefficients[1, 1] gdp_coef_val <- reg_summary$coefficients[2, 1] r_sq_val <- reg_summary$r.squared # 将结果追加到数据框 coef_results <- rbind(coef_results, data.frame( country = country, intercept = intercept_val, gdp_coefficient = gdp_coef_val, r_squared = r_sq_val )) } # 查看最终结果 print(coef_results)
更高效的无循环实现(推荐)
使用purrr包的批量处理函数,简化代码逻辑:
library(purrr) library(dynlm) library(tibble) # 定义国家-变量映射列表 country_vars <- list( pak = list(gdp = "pakgdp", cons = "pakcons"), bel = list(gdp = "belgdp", cons = "belcons"), usa = list(gdp = "usagdp", cons = "usacons") ) # 批量执行回归并提取结果 results <- map_dfr(country_vars, function(pair) { reg_formula <- as.formula(paste(pair$cons, "~", pair$gdp)) model <- dynlm(reg_formula, data = mg.ts) summ <- summary(model) # 返回当前国家的结果 tibble( intercept = summ$coefficients[1, 1], gdp_coefficient = summ$coefficients[2, 1], r_squared = summ$r.squared ) }, .id = "country") # 输出结果 print(results)
核心注意事项
- 避免嵌套循环:你需要的是同国家GDP与消费的一对一回归,嵌套循环会导致所有变量交叉回归,不符合需求。
- 公式构建必须通过
paste拼接变量名字符串,再转为formula对象,确保R能正确识别数据列。 - 存储结果时,提前初始化空数据框或使用
map_dfr自动拼接,比反复rbind更高效。
内容的提问来源于stack exchange,提问作者Rbeginner12345
相关产品推荐
相关产品推荐

