Вычисление доверительных интервалов с прогнозируемыми значениями

#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)