在R中将“〜call”与动态变量一起使用

时间:2020-05-28 20:06:06

标签: r function statistics regression classification

我目前正在使用R进行回归和分类。

因此,我使用类似于X ~ Y的公式来进行有关X的预测。 我现在正尝试在for循环内使用函数来对代字号X侧的不同值和Y侧的常数进行多个预测。像这样: X1 ~ Y X2 ~ Y X3 ~ Y

,其中X1,X2,X3和Y都是数据列(data $ X1 <-a,data $ X2 <-b,data $ X3 <-c,data $ Y),如果这很重要

那么如何在 -Expression中动态选择一个变量?我已经尝试过类似的方法,但是它不起作用:

# referring to "iris" data set with columns (Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species)

getFormula <- function(variable){
  variable ~ Sepal.Length + Sepal.Width + Species
}

petal.length.formula <- getFormula(Petal.Length)
petal.width.formula <- getFormula(Petal.Width)

我明白了:

petal.length.formula: variable ~ Sepal.Lenght + Sepal.Width + Species
petal.width.formula: variable ~ Sepal.Lenght + Sepal.Width + Species

但我想实现这一目标:

petal.length.formula: Petal.Length ~ Sepal.Lenght + Sepal.Width + Species
petal.width.formula: Petal.Width ~ Sepal.Lenght + Sepal.Width + Species

由于我在Y侧有40多个变量,在X侧有10个变量,因此手动键入每个公式真的很麻烦。 有人可以帮我解决这个问题吗?

我找不到类似的问题,因为我很难弄清楚要用来查找有关此内容的关键字。

如果可能的话,我不愿使用任何其他库,因为我是R的新手,并且想先弄清楚R的基本原理。

由于英语不是我的母语,所以我希望您能理解我的问题,如果需要,我当然乐于进一步解释。预先感谢您的宝贵时间!

1 个答案:

答案 0 :(得分:0)

您可以尝试此操作,您需要将字符传递给变量。这样比较容易,如果X端有10个变量,则可以轻松地遍历它们:

getFormula <- function(variable){
  as.formula(paste(variable,"~ Sepal.Length + Sepal.Width + Species"))
}

petal.length.formula <- getFormula("Petal.Length")
petal.width.formula <- getFormula("Petal.Width")

lm(petal.length.formula,data=iris)
Call:
lm(formula = petal.length.formula, data = iris)

Coefficients:
      (Intercept)       Sepal.Length        Sepal.Width  Speciesversicolor  
         -1.63430            0.64631           -0.04058            2.17023  
 Speciesvirginica  
          3.04911 

您还可以尝试按照@BenBolker和@MrFlick的建议重新配制:

getFormula <- function(variable){
  reformulate(c("Sepal.Length","Sepal.Width","Species"), 
response = variable, intercept = TRUE)
}

lm(getFormula("Petal.Length"),data=iris)

Call:
lm(formula = getFormula("Petal.Length"), data = iris)

Coefficients:
      (Intercept)       Sepal.Length        Sepal.Width  Speciesversicolor  
         -1.63430            0.64631           -0.04058            2.17023  
 Speciesvirginica  
          3.04911