带有变量名的 lm 公式

lm formula with variable names in it

我想编写一个采用 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))
}

如您所见,要从可用数据集创建新模型,我需要指定哪个变量应该是因变量。但是,我并不知道这个名字,我只需要从原始模型中提取它即可。所以我在上面的函数中做了它,但它导致了一个错误:

Error in model.frame.default(formula = y_name ~ ., data = dataset_new, : variable lengths differ (found for '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 公式以构建正确的模型?

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

lm(dataset_new)