r - 如何将以下“poly”输出转换为可在 Excel 中使用的函数?
问题描述
我使用以下代码在 R 中进行了线性回归:
model <- lm(z~poly(x3,x4, degree=2,raw=TRUE), MyData)
输出是这样的:
(Intercept)
0.1742518
poly(x3, x4, degree = 2, raw = TRUE)2.0
-1.130082
poly(x3, x4, degree = 2, raw = TRUE)1.1
-17.35482
...
有没有办法自动将上面的代码转换成这个?
z ~ 0.1742518-1.130082*x3^2-17.35482*x3*x4
请记住,虽然我们这里有两个变量 (x3,x4),但可能会有更多变量,而且多项式生成的项数可能非常大,从而使手动创建此类公式变得乏味。
解决方案
你要求灵活性,我在这里提供了它。主要的挑战是处理产生的系数名称poly
以使它们对一个人来说很漂亮。请注意,我在此处提供的解决方案假定模型中的每个术语都包含在内,poly
但截距除外。
MyData = data.frame(x3=runif(100),x4=runif(100))
MyData$z = 0.17 -1.13*MyData$x3^2-17.35*MyData$x3*MyData$x4+rnorm(100)
model <- lm(z~poly(x3,x4, degree=2,raw=TRUE), MyData)
summary(model)$coef
您的问题不包括可重复的样本,所以我创建了一个。下面的函数旨在处理 poly 系数名称并返回一个不错x3
的x4
类型名称。
processPolyNames = function(coef){
members = strsplit(mgsub::mgsub(coef,c("poly\\(",", degre.*"),c("","")),", ")[[1]]
degree = as.numeric(strsplit(strsplit(coef,")")[[1]][2],"\\.")[[1]])
coef_out = ""
for(d in seq_along(degree)){
if(degree[d] == 0) next
if(degree[d] == 1){
if(coef_out == ""){
coef_out = members[d]
} else {
coef_out = paste0(coef_out,"*",members[d])
}
} else {
if(coef_out == ""){
coef_out = paste0(members[d],"^",degree[d])
} else {
coef_out = paste0(coef_out,"*",members[d],"^",degree[d])
}
}
}
return(coef_out)
}
现在我们提取模型的系数——如果你只想包含显着的影响,你可以过滤coefs
。然后我lapply
将函数写入丑陋的名字以获得漂亮的名字。
coefs = summary(model)$coef[,1]
prettyNames = lapply(names(coefs)[-1],processPolyNames)
unlist(prettyNames)
#> [1] "x3" "x3^2" "x4" "x3*x4" "x4^2"
现在我们需要制作一个漂亮的模型。这只是一个 for 循环。从截距开始,我们构建模型(将系数四舍五入到 7 位有效数字。
prettyModel = ""
for(i in seq_along(coefs)){
if(i == 1){
prettyModel = paste0(prettyModel,round(coefs[i],7))
} else {
prettyModel = paste0(prettyModel,ifelse(coefs[i] >= 0,"+",""),round(coefs[i],7),"*",prettyNames[[i-1]])
}
}
prettyModel
#> [1] "0.1169037+1.8662887*x3-3.0333651*x3^2-1.3031079*x4-17.1641031*x3*x4+1.5259313*x4^2"
然后,该模型可以mgsub
根据需要用 Excel 单元格引用替换变量。
推荐阅读
- java - 无法从本地 Spring Boot 项目连接到正在运行的 postgresql 容器
- asp.net - 使用 ASP.Net 录制音频并将其保存到数据库(服务器端)
- java - Apache POI 可以应用 Top 10 条件格式吗?
- arrays - React Native 评论回复部分
- deep-learning - 我们如何在文本分类中选择最大输入长度?
- algorithm - 虚拟机管理程序算法通常是如何布局的?
- plotly - 在 plotly/dash 中未选择下拉菜单时显示空白页
- python - 如何将多 fasta 文件头转换为单个 fasta 头?
- objective-c - 如何重构 XCTest 期望?
- reactjs - 在 react-router-dom 中找不到多个交换机的路由