能否用mapply拟合不同回归模型?iris数据集实操报错求助
使用mapply在iris数据集上拟合多个回归模型的问题解决
你好呀,这个目标完全可以实现!你遇到的错误是因为把lm的data参数错误地塞进了公式字符串里,导致语法解析失败。
错误原因分析
你原来的代码里,用paste0生成的字符串是类似"Sepal.Length~Sepal.Width,data=iris",但lm函数的语法是lm(formula, data = ...)——公式部分只需要因变量~自变量,data是独立的参数,不能和公式混在一起拼接,所以parse函数会把逗号当成公式里的非法字符,就出现了unexpected ','的错误。
修正后的实现步骤
这里给你两种简洁的修正方式,选哪种都可以:
方式一:用reformulate动态创建公式(推荐,更直观)
重新定义回归函数:
reg <- function(dependent, independent) { # reformulate(自变量, 响应变量) 会自动生成正确的公式 lm(reformulate(independent, response = dependent), data = iris) }保留你原来的变量定义:
dependent <- c("Sepal.Length", "Sepal.Width") independent <- c("Sepal.Width", "Sepal.Length") # 按你的需求保留自变量顺序调用mapply(记得加
SIMPLIFY = FALSE来保留每个模型的完整结构):models_reg <- mapply(reg, dependent, independent, SIMPLIFY = FALSE)
方式二:用as.formula正确拼接公式
如果你习惯用paste拼接的方式,只要把data参数单独传递就行:
reg <- function(dependent, independent) { lm(as.formula(paste0(dependent, "~", independent)), data = iris) }
后面的变量定义和mapply调用和方式一一致。
验证结果
运行后,你可以通过models_reg[[1]]查看第一个回归模型(Sepal.Length ~ Sepal.Width)的结果,models_reg[[2]]查看第二个模型(Sepal.Width ~ Sepal.Length)的结果,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

