首页 > 解决方案 > 如何将以下“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),但可能会有更多变量,而且多项式生成的项数可能非常大,从而使手动创建此类公式变得乏味。

标签: rlmpolynomials

解决方案


你要求灵活性,我在这里提供了它。主要的挑战是处理产生的系数名称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 系数名称并返回一个不错x3x4类型名称。

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 单元格引用替换变量。


推荐阅读