簡體   English   中英

如何在 r 中的 function 中創建和使用公式?

[英]How to create and use a formula in function in r?

我正在嘗試創建一個可重復使用的 function。 在function中,我想自己定義一個公式,然后用我的function和output中的lm測試公式回歸結果總結。

我嘗試使用as.formula function 在我的自定義 function 中創建我自己的公式,但是我收到以下代碼的錯誤消息,不知道為什么,有人可以幫助我嗎?

# 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)


對於您的示例,我認為您不需要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 中調用變量,則必須按字符更改 arguments。 因為您想使用數據框的名稱。

# 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)

我希望我能理解你的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM