如何将以下“poly”输出转换为Excel中可用的函数?

时间:2018-05-01 12:40:35

标签: r lm polynomials

我使用以下代码在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),但可能会有更多变量,而且多项式生成的术语数量也会非常大,这使得手动创建这些公式变得乏味。

2 个答案:

答案 0 :(得分:1)

您已经要求灵活性,我已经在这里提供了它。主要的挑战是处理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

你的问题没有包含可重复的样本,所以我创建了一个。以下函数用于处理多边形系数名称,并返回一个不错的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单元格引用替换变量。

答案 1 :(得分:0)

对于包含2个变量的上述示例,解决方案可以是:

x3 <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
x4 <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
y <- x3*3 + 3* x3 * x4
model <- lm(y ~ poly(x3, x4, degree=2, raw=TRUE))

paste( "z ~",unname(model$coefficients)[1], "-", unname(model$coefficients)[2], 
       "* x3 ^ 2 -", unname(model$coefficients)[3], "* x3 * x4" )
##"z ~ -1.91152113238255e-12 - 5.4307136268434e-14 * x3 ^ 2 - 1.04899226410413e-14 * x3 * x4"

但是,如果您想以更一般的方式使用它(处理公式的不同数量的参数等),那么您可以处理model中的各种组件:

str(model)
List of 12
 $ coefficients : Named num [1:6] -1.91e-12 5.43e-14 1.05e-14 3.00 3.00 ...
  ..- attr(*, "names")= chr [1:6] "(Intercept)" "poly(trt, ctl, degree = 2, raw = TRUE)1.0" "poly(trt, ctl, degree = 2, raw = TRUE
...

上面只是一个部分输出,但你可以找到列表的成员,它将包含公式本身和在那里使用的所有变量,然后编写循环遍历每个变量的函数并将系数添加到就像上面的例子一样。