Как создать и использовать формулу в функции в r? - PullRequest
0 голосов
/ 10 октября 2019

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

Я пытался использовать функцию as.formula, чтобысоздать собственную формулу в моей самоопределенной функции, но я получаю сообщения об ошибках со следующими кодами, не знаю почему, кто-нибудь может мне помочь?

# create the data
x <- c(1,2,3,5,6,7,8,1,1,2,1)
y <- c(2,3,4,5,1,3,4,5,6,7,2)
z <- c(2,3,4,1,2,3,33,5,2,4,5)
i <- c(2,4,4,5,1,3,2,5,6,7,2)
j <- c(2,9,4,1,2,3,4,5,2,4,5)
k <- c(2,12,4,5,1,3,4,5,6,7,2)
q <- c(2,55,4,1,2,5,4,5,2,4,5)
m <- data.frame(x,y,z)

# the function
polyRegress <- function(pre1, pre2, dv, df){

  # This is the formula I want to test:
  # model <- lm(z ~ x + y + I(x^2) + I(x*y) + I(y^2), data=m)

  f <- as.formula(paste0(dv, " ~ ", pre1, " + ", pre2, " + ", "I(", pre1, "^2)", " + ", "I(", pre1, "*", pre2, ")", " + ", "I(", pre2, "^2)")

  results <- lm(f, data=df)
  summary(results)
}

# main
polyRegress(x, y, z, m)
polyRegress(i, j, k, m)

Кроме того, в выходных данных двух вышеприведенных функций polyRegress я хочу, чтобы имена коэффициентов были x, y, I(x^2), I(x * y), I(y^2) и i, j, I(i^2), I(i * j), I(j^2), а не pre1, pre2, I(pre1^2), I(pre1 * pre2), I(pre2^2)

1 Ответ

1 голос
/ 10 октября 2019


В вашем примере, я думаю, вам не нужно иметь аргумент df , потому что x, y, z, i ... являются векторами.
Когда вы вызываете polyRegress (x, y, z, m) , вы используете векторы x, y и z, а не имена столбцов в m.
Таким образом, в первом случае вы можете использовать решения, которые даютс помощью с использованием замены, чтобы получить имя аргумента, с помощью для изменения имен коэффициентов.

# create the data
x <- c(1,2,3,5,6,7,8,1,1,2,1)
y <- c(2,3,4,5,1,3,4,5,6,7,2)
z <- c(2,3,4,1,2,3,33,5,2,4,5)
i <- c(2,4,4,5,1,3,2,5,6,7,2)
j <- c(2,9,4,1,2,3,4,5,2,4,5)
k <- c(2,12,4,5,1,3,4,5,6,7,2)
q <- c(2,55,4,1,2,5,4,5,2,4,5)
m <- data.frame(x,y,z)

# the function
polyRegress <- function(pre1, pre2, dv){
  # change pre1 by "x" or "i" ...
  pre1 <- deparse(substitute(pre1))
  pre2 <- deparse(substitute(pre2))
  dv <- deparse(substitute(dv))

  f <- paste0(dv, " ~ ", pre1, " + ", pre2, " + ", "I(", pre1, "^2)", " + ", "I(", pre1, "*", pre2, ")", " + ", "I(", pre2, "^2)")

  results <- lm(f)
  # at this step results$call = lm(formula = f), let's change it !
  results$call <- call('lm', formula = formula(f))
  summary(results)
}

# main
polyRegress(x, y, z)
polyRegress(i, j, k)

Но если вы действительно хотите вызвать переменную в вашем фрейме данных, вы должны изменить аргументы по символам. Потому что вы хотите использовать имена столбцов dataframe.

# create the data
m <- data.frame(x,y,z,i,j,k)
rm(x,y,z,i,j,k)

# the function
polyRegress <- function(pre1, pre2, dv, df){
  f <- paste0(dv, " ~ ", pre1, " + ", pre2, " + ", "I(", pre1, "^2)", " + ", "I(", pre1, "*", pre2, ")", " + ", "I(", pre2, "^2)")

  results <- lm(f, data = df)
  # at this step results$call = lm(formula = f, data = df), let's change it !
  results$call <- call('lm', formula = formula(f), data = substitute(df)) 
  summary(results)
}

# main
polyRegress("x", "y", "z", m)
polyRegress("i", "j", "k", m)

Надеюсь, я понимаю ваше требование.

...