R语言RSA包循环执行响应面分析报错问题求助
问题:RSA包在for循环中使用字符串公式无法运行,lm函数却正常
我用R的RSA包做响应面分析,直接指定因变量的代码能正常运行:
library(RSA) dat <- iris lm(Petal.Length~Sepal.Length*Sepal.Width, data=dat) RSA(Petal.Length~Sepal.Length*Sepal.Width, data=dat) lm(Petal.Width~Sepal.Length*Sepal.Width, data=dat) RSA(Petal.Width~Sepal.Length*Sepal.Width, data=dat)
但改用for循环遍历数据框第3、4列作为因变量时,lm能正常运行,RSA却报错:
for(i in 3:4){ model1 <- lm(paste0(colnames(dat[i]),"~ Sepal.Length*Sepal.Width"), data=dat) # 正常运行 model2 <- RSA(paste0(colnames(dat[i]),"~ Sepal.Length*Sepal.Width"), data=dat) # 无法运行 out <- list(model1, model2) print(out) }
甚至单独执行时,字符串形式的公式也会失败,而直接写公式对象却正常:
i=3 RSA(paste0(colnames(dat[i]),"~ Sepal.Length*Sepal.Width"), data=dat) # 失败 RSA(Petal.Length~Sepal.Length*Sepal.Width, data=dat) # 正常
原因分析
lm函数内部会自动将传入的字符串转换为公式对象(formula),但RSA函数的formula参数只接受公式对象,不支持直接传入字符串,所以会报错。
解决方法
将拼接好的字符串公式用as.formula()转换为公式对象后,再传入RSA函数即可。修改后的代码如下:
library(RSA) dat <- iris for(i in 3:4){ # 拼接公式字符串并转换为公式对象 formula_str <- paste0(colnames(dat[i]), "~ Sepal.Length*Sepal.Width") formula_obj <- as.formula(formula_str) model1 <- lm(formula_obj, data=dat) model2 <- RSA(formula_obj, data=dat) out <- list(model1, model2) print(out) }
单独测试的代码也可以修改为:
i=3 formula_obj <- as.formula(paste0(colnames(dat[i]),"~ Sepal.Length*Sepal.Width")) RSA(formula_obj, data=dat) # 正常运行
内容的提问来源于stack exchange,提问作者Tube
相关产品推荐
相关产品推荐

