带有变量名的 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)
我想编写一个采用 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)