Как преобразовать следующий вывод «poly» в функцию, используемую в Excel? - PullRequest
0 голосов
/ 01 мая 2018

Я провел линейную регрессию в 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 голосов
/ 01 мая 2018

Вы просили о гибкости, и я вроде предоставил это здесь. Основная проблема заключается в обработке имен коэффициентов, создаваемых 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

Ваш вопрос не включает воспроизводимый образец, поэтому я создал его. Приведенная ниже функция предназначена для обработки имени множителя и получения вместо него хорошего имени типа 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"

Теперь нам нужно сделать красивую модель. Это просто цикл. Начиная с перехвата, мы затем просто строим модель (округляя коэффициенты до 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 по желанию.

0 голосов
/ 01 мая 2018

Для приведенного выше примера с 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
...

Выше приведен только частичный вывод, но вы можете найти членов списка, который будет содержать саму формулу и все переменные, которые там использовались, а затем написать функцию, которая будет проходить по каждой переменной и добавить коэффициент к это так же, как в примере выше.

...