带有变量名的lm公式

时间:2019-02-18 14:19:59

标签: r formula lm

我想编写一个采用lm模型的函数,尝试添加一些功能并测试其统计意义。我将代码如下:

library(rlang)
library(tidyverse)
dataset <- data.frame(y = rnorm(100, 2, 3),
                      x1 = rnorm(100, 0, 4),
                      x2 = rnorm(100, 2, 1),
                      x3 = rnorm(100, 9, 1))

model1 <- lm(y ~ ., data = dataset)

dataset2 <- dataset %>% 
  mutate(x10 = rnorm(100, 20, 9),
         x11 = rnorm(100, 3, 3))

test_var <- function(data, var, model){
  y_name <- names(model$model)[1]

  dataset_new <- data %>% 
    select_at(vars(y_name,
                   str_remove_all(labels(model), '`'),
                   var))

  model_new <- lm(y_name ~ ., data = dataset_new)  
  return(summary(model_new))
}

您会注意到,要从可用数据集中创建新模型,我需要指定哪个变量应为因变量。但是,我不直接知道这个名称,我只需要将其从原始模型中取出即可。所以我在上面的函数中做到了,但是会导致错误:

  

model.frame.default中的错误(公式= y_name〜。,data = dataset_new,:     可变长度不同(找到“ y”)

如果我错了,请更正我,但是我相信这是由于y_name是字符串而不是符号。因此,我尝试了以下版本:

test_var <- function(data, var, model){
  y_name <- sym(names(model$model)[1])

  dataset_new <- data %>% 
    select_at(vars(!!y_name,
                   str_remove_all(labels(model), '`'),
                   var))

  model_new <- lm(eval(y_name) ~ ., data = dataset_new)  
  return(summary(model_new))
}

尽管看起来可行,但生成的模型非常合适,因为y不仅被视为因变量,而且被视为功能之一。用eval(y_name) ~ . - eval(y_name)指定公式在这里无济于事。所以我的问题是:我应该如何将因变量名称传递给lm公式以建立正确的模型?

1 个答案:

答案 0 :(得分:1)

由于dataset_new在第一列中包含因变量,因此您实际上可以简单地使用

lm(dataset_new)