R语言使用paste0构建含二次项lm模型时遇语法错误求助
批量构建带二次项的线性模型报错解决办法
问题原因
你写的quad<-lm(paste0('PE~',IV,'+I(',IV,'^2),data=Chem'))犯了关键错误:把data=Chem参数塞进了公式字符串里,导致lm()函数将整个字符串解析为公式,而公式语法不允许出现逗号,因此触发了语法错误。
修正方案
公式部分仅用paste0()生成模型表达式,data参数单独作为lm()的第二个参数传入,不要和公式混在一起。
单个自变量的修正代码
Chem<-structure(list(PE = c(9L, 8L, 8L, 9L, 5L, 6L, 10L, 9L, 11L, 9L, 7L, 7L, 7L, 10L, 13L, 14L, 5L, 6L, 10L, 12L, 14L, 13L, 12L, 12L, 7L, 7L, 6L, 12L, 9L, 14L), ROR5 = c(13, 13, 13, 12.2, 10, 9.8, 9.9, 10.3, 9.5, 9.9, 7.9, 7.3, 7.8, 6.5, 24.9, 24.6, 14.9, 13.8, 13.5, 14.9, 15.4, 11.6, 14.2, 13.8, 12, 11, 13.8, 11.5, 6.4, 3.8), DE = c(0.7, 0.7, 0.4, 0.2, 0.4, 0.5, 0.5, 0.3, 0.4, 0.4, 0.4, 0.6, 0.4, 0.4, 0, 0, 1.1, 0.6, 0.5, 0.3, 0.3, 0.4, 0.2, 0.1, 0.5, 0.3, 0.2, 0.4, 0.7, 0.6), SALESGR5 = c(20.2, 17.2, 14.5, 12.9, 13.6, 12.1, 10.2, 11.4, 13.5, 12.1, 10.8, 15.4, 11, 18.7, 16.2, 16.1, 13.7, 20.9, 14.3, 29.1, 15.2, 18.7, 16.7, 12.6, 15, 12.8, 14.9, 15.4, 16.1, 6.8), EPS5 = c(15.5, 12.7, 15.1, 11.1, 8, 14.5, 7, 8.7, 5.9, 4.2, 16, 4.9, 3, -3.1, 16.9, 16.9, 48.9, 36, 16, 22.8, 15.1, 22.1, 18.7, 18, 14.9, 10.8, 9.6, 11.7, -2.8, -11.1), NPM1 = c(7.2, 7.3, 7.9, 5.4, 6.7, 3.8, 4.8, 4.5, 3.5, 4.6, 3.4, 5.1, 5.6, 1.3, 12.5, 11.2, 5.8, 10.9, 8.4, 4.9, 21.9, 8.1, 8.2, 5.6, 3.6, 5, 4.4, 7.2, 6.8, 0.9), PAYOUTR1 = c(0.43, 0.38, 0.41, 0.57, 0.32, 0.51, 0.38, 0.48, 0.57, 0.49, 0.49, 0.27, 0.32, 0.38, 0.32, 0.47, 0.1, 0.16, 0.4, 0.36, 0.23, 0.2, 0.37, 0.34, 0.36, 0.34, 0.31, 0.51, 0.22, 1)), class = "data.frame", row.names = c(NA, -30L)) IV<-'SALESGR5' # 单个线性模型(正确写法) linear<-lm(paste0('PE~',IV), data=Chem) # 单个二次项模型(修正后的写法) quad<-lm(paste0('PE~',IV,'+I(',IV,'^2)'), data=Chem)
批量处理多个自变量的示例
如果要给多个自变量批量生成带二次项的模型,可以用lapply()实现:
# 定义所有需要处理的自变量 IV_list <- c('SALESGR5', 'ROR5', 'DE', 'EPS5', 'NPM1', 'PAYOUTR1') # 批量生成模型 model_list <- lapply(IV_list, function(var) { lm(paste0('PE~', var, '+I(', var, '^2)'), data=Chem) }) # 给模型命名,方便后续调用 names(model_list) <- IV_list # 查看某个模型的结果,比如SALESGR5的二次项模型 summary(model_list[['SALESGR5']])
补充说明
paste0()仅负责拼接公式表达式,lm()的其他参数(比如data)要单独传入,不能混在公式字符串里。- 如果需要更灵活的公式构建,也可以用
reformulate()函数替代paste0(),比如:quad <- lm(reformulate(c(IV, paste0('I(', IV, '^2)')), response='PE'), data=Chem)
内容的提问来源于stack exchange,提问作者JohnS
相关产品推荐
相关产品推荐

