使用回归模型通过扫帚包生成预测值
Using regression model to generate predicted values with broom package
我有一个学生属性和考试成绩的数据框,并且我为每个年级(1 到 12)创建了一个线性模型。我正在使用 broom 包为每个年级有效地创建模型。下面是一个简化的示例数据集和我正在使用的代码。
#start df creation
school_year <- rep(2017:2020, 120)
grade <- rep(1:12, each = 40)
attendance_rate <- round(runif(480, min=25, max=100), 1)
test_growth <- round(runif(480, min = -12, max = 38))
binary_flag <- round(runif(480, min = 0, max = 1))
score <- round(runif(480, min = 92, max = 370))
survey_response <- round(runif(480, min = 1, max = 4))
df <- data.frame(school_year, grade, attendance_rate, test_growth, binary_flag, score, survey_response)
df$survey_response[df$grade == 1] <- NA
# end df creation
df_train <- df %>% filter(!(school_year == 2020))
df_test <- df %>% filter(school_year == 2020)
#create models
model <- df_train %>%
group_by(grade) %>%
nest() %>%
mutate(fit = map(data, ~ if(all(is.na(.x$survey_response)))
lm(score ~ attendance_rate + test_growth + binary_flag, data = .x)
else lm(score ~ attendance_rate + test_growth + binary_flag + survey_response, data = .x)),
tidied = map(fit, tidy),
augmented = map(fit, augment),
glanced = map(fit, glance))
训练完模型后,我想用它来预测 2020 学年/测试数据集的分数。 (上面代码中的增强函数只为训练数据集中的观察值生成拟合值。)显然,我需要将上面创建的一年级模型仅应用于测试集中的一年级数据,二年级模型以仅适用于测试集中的二年级数据,依此类推。出于这个原因,我无法让基本的 predict(fit, df_test)
工作。
我该怎么做?任何帮助将不胜感激。
您可以 nest
测试数据,通过 grade
和 predict
.
将其与 model
合并
library(tidyverse)
df_test %>%
nest(test_data = -grade) %>%
inner_join(model, by = 'grade') %>%
mutate(result = map2(fit, test_data, predict))
我有一个学生属性和考试成绩的数据框,并且我为每个年级(1 到 12)创建了一个线性模型。我正在使用 broom 包为每个年级有效地创建模型。下面是一个简化的示例数据集和我正在使用的代码。
#start df creation
school_year <- rep(2017:2020, 120)
grade <- rep(1:12, each = 40)
attendance_rate <- round(runif(480, min=25, max=100), 1)
test_growth <- round(runif(480, min = -12, max = 38))
binary_flag <- round(runif(480, min = 0, max = 1))
score <- round(runif(480, min = 92, max = 370))
survey_response <- round(runif(480, min = 1, max = 4))
df <- data.frame(school_year, grade, attendance_rate, test_growth, binary_flag, score, survey_response)
df$survey_response[df$grade == 1] <- NA
# end df creation
df_train <- df %>% filter(!(school_year == 2020))
df_test <- df %>% filter(school_year == 2020)
#create models
model <- df_train %>%
group_by(grade) %>%
nest() %>%
mutate(fit = map(data, ~ if(all(is.na(.x$survey_response)))
lm(score ~ attendance_rate + test_growth + binary_flag, data = .x)
else lm(score ~ attendance_rate + test_growth + binary_flag + survey_response, data = .x)),
tidied = map(fit, tidy),
augmented = map(fit, augment),
glanced = map(fit, glance))
训练完模型后,我想用它来预测 2020 学年/测试数据集的分数。 (上面代码中的增强函数只为训练数据集中的观察值生成拟合值。)显然,我需要将上面创建的一年级模型仅应用于测试集中的一年级数据,二年级模型以仅适用于测试集中的二年级数据,依此类推。出于这个原因,我无法让基本的 predict(fit, df_test)
工作。
我该怎么做?任何帮助将不胜感激。
您可以 nest
测试数据,通过 grade
和 predict
.
model
合并
library(tidyverse)
df_test %>%
nest(test_data = -grade) %>%
inner_join(model, by = 'grade') %>%
mutate(result = map2(fit, test_data, predict))