#r #regression #linear-regression #tidyverse #broom
#r #регрессия #линейная регрессия #tidyverse #метла
Вопрос:
У меня есть фрейм данных атрибутов учащихся и результатов тестов, и я создал линейную модель для каждого уровня оценки (с 1 по 12). Я использую пакет broom для эффективного создания модели для каждого уровня оценки. Ниже приведен упрощенный пример набора данных и код, который я использую.
Как только я обучу модель, я использую ее для прогнозирования результатов на 2020 учебный год. Модель 1-го класса применяется только к данным 1-го класса в тестовом наборе, модель 2-го класса применяется только к данным 2-го класса в тестовом наборе и так далее.
#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_predict <- 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))
#generate projections for values in df_predict
df_predict %>%
nest(test_data = -grade) %>%
inner_join(model, by = 'grade') %>%
mutate(result = map2(fit, test_data, predict))
Я пытаюсь определить, могу ли я сгенерировать 95% доверительный интервал для каждого учащегося в наборе данных df_predict, пока я генерирую прогнозы из выборки. Мне нужно, чтобы стандартное отклонение зависело от оценки. Это дало бы мне минимальную и максимальную точку отсечения, которая позволила бы мне идентифицировать отклонения в фактических результатах тестирования.
Ответ №1:
Попробуйте это. Вы можете создать другой слот с новой переменной confinter
, которую вы можете включить interval = 'prediction'
, чтобы вычислять доверительные интервалы на уровне 95%. Здесь код:
#generate projections for values in df_predict using interval
dfpred2 <- df_predict %>%
nest(test_data = -grade) %>%
inner_join(model, by = 'grade') %>%
mutate(result = map2(fit, test_data, predict),
confinter=map2(fit, test_data, predict,interval = 'prediction'))
Комментарии:
1. Большое вам спасибо! Это работает! Со столбцом ‘convinter’ было немного сложно работать; bc это вложенный df, convinter col был списком матриц. Чтобы я мог отменить проверку фрейма данных и связать информацию каждого учащегося с их прогнозируемыми значениями и нижними / верхними границами, мне нужно было создать столбцы, которые сохраняли элементы списка нетронутыми при извлечении каждого из столбцов матрицы отдельно.
2. Вот как в итоге выглядел код:
dfpred2 <- df_predict %>% nest(test_data = -grade) %>% inner_join(model, by = 'grade') %>% mutate(result = map2(fit, test_data, predict), confinter=map2(fit, test_data, predict,interval = 'prediction')) %>% mutate(confinter_predictedval = lapply(confinter,
[,,1), confinter_lowerbound = lapply(confinter,
[,,2), confinter_upperbound = lapply(confinter,
[,,3)) %>% unnest(test_data, result, confinter_lowerbound, confinter_upperbound)