我想编写一个采用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
公式以建立正确的模型?
答案 0 :(得分:1)
由于dataset_new
在第一列中包含因变量,因此您实际上可以简单地使用
lm(dataset_new)