lm公式中包含变量名称

问题描述 投票:1回答:1

我想写一个函数,它将采用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中的错误(formula = 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公式来构建正确的模型?

r formula lm
1个回答
1
投票

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

lm(dataset_new)
© www.soinside.com 2019 - 2024. All rights reserved.