Регрессия скользящего окна по группам в R (с датами)

ЭТО МОИ ДАННЫЕ Регрессия скользящего окна по группам в R (с датами)

У меня есть данные панели в R, поэтому я хочу создать линейную регрессию с скользящим окном по группам. Например, у меня много дат от 1 до 618. Каждое число представляет одну дату, но у меня есть более одного наблюдения для каждой даты.

Я хочу создать скользящее окно на 20 дат. Наконец, я хочу вывести все коэффициенты для lm(y~x1+x2+x3+x4+x5+x6) в период 1:20 и создать скользящее окно для выполнения другой регрессии для 2:21, 3:22. и так далее для всех моих наблюдений, поэтому последние коэффициенты относятся к периоду 598:618 (у меня 618, поэтому я не могу сделать это вручную).

Моя проблема в том, что я выбираю окно для 20 наблюдений, но я могу выбрать только эти 20 первых наблюдений, например: 1 1 1 1 1 1 1 .... 1 и, возможно, первые 20 наблюдений - это только наблюдения за первой датой (1), потому что по дате существует более одного наблюдения. Итак, я хочу отфильтровать 20 наблюдений по группам, на самом деле это будет более 20 наблюдений, но я хочу скользить по дате (от 1 до 20, независимо от наблюдений.

Я надеюсь, что это было хорошо понято.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать несколько линейных моделей для заданного интервала дат следующим образом:

library(tidyverse)

# example data
set.seed(1337)
n_dates <- 10
data <- tibble(
  date = runif (100, min = 1, max = n_dates) %>% floor(),
  x1 = runif (100)**2,
  x2 = runif (100) * 2,
  x3 = runif (100) + 2,
  y = x1 + 2 * x2 + runif (100)
) %>%
  arrange(date)
data
#> # A tibble: 100 × 5
#>     date         x1    x2    x3     y
#>    <dbl>      <dbl> <dbl> <dbl> <dbl>
#>  1     1 0.754      0.700  2.21 2.79 
#>  2     1 0.0230     1.97   2.70 4.89 
#>  3     1 0.388      0.500  2.21 1.54 
#>  4     1 0.225      0.135  2.87 0.849
#>  5     1 0.00000810 0.139  2.22 1.12 
#>  6     1 0.255      0.893  2.21 2.25 
#>  7     1 0.402      1.37   2.06 3.51 
#>  8     1 0.00275    0.363  2.68 0.984
#>  9     2 0.238      1.68   2.53 3.98 
#> 10     2 0.0309     1.47   2.05 3.69 
#> # … with 90 more rows

# number of rows per day
data %>% count(date)
#> # A tibble: 9 × 2
#>    date     n
#>   <dbl> <int>
#> 1     1     8
#> 2     2    10
#> 3     3    15
#> 4     4     8
#> 5     5    10
#> 6     6    10
#> 7     7    12
#> 8     8     7
#> 9     9    20

# size of rolling window in days
window_size <- 3

models <- tibble(
  from = seq(n_dates),
  to = from + window_size - 1
) %>%
  mutate(
    data = from %>% map2(to, ~ data %>% filter(date >= .x & date <= .y)),
    model = data %>% map(possibly(~ lm(y ~ x1 + x2 + x3, data = .x), NA))
  )
models
#> # A tibble: 10 × 4
#>     from    to data              model    
#>    <int> <dbl> <list>            <list>   
#>  1     1     3 <tibble [33 × 5]> <lm>     
#>  2     2     4 <tibble [33 × 5]> <lm>     
#>  3     3     5 <tibble [33 × 5]> <lm>     
#>  4     4     6 <tibble [28 × 5]> <lm>     
#>  5     5     7 <tibble [32 × 5]> <lm>     
#>  6     6     8 <tibble [29 × 5]> <lm>     
#>  7     7     9 <tibble [39 × 5]> <lm>     
#>  8     8    10 <tibble [27 × 5]> <lm>     
#>  9     9    11 <tibble [20 × 5]> <lm>     
#> 10    10    12 <tibble [0 × 5]>  <lgl [1]>

models %>%
  filter(!is.na(model)) %>%
  transmute(
    from, to,
    coeff = model %>% map(coefficients),
    r2 = model %>% map_dbl(~ .x %>% summary() %>% pluck("r.squared"))
  ) %>%
  unnest_wider(coeff)

# A tibble: 9 x 7
#   from    to `(Intercept)`    x1    x2      x3    r2
#  <int> <dbl>         <dbl> <dbl> <dbl>   <dbl> <dbl>
#1     1     3         0.601 0.883  2.07 -0.0788 0.970
#2     2     4         0.766 0.965  2.01 -0.141  0.965
#3     3     5         0.879 0.954  1.94 -0.165  0.953

Другой способ подмножества групп — использовать nest:

# get all observations from day 3 to 5
data %>% arrange(date) %>% nest(-date) %>% slice(3:5) %>% unnest()

Большое спасибо!! Вы поместили некоторые команды, которых я не знал, но ваш код отлично работал, когда я просмотрел эти команды. Спасибо еще раз.

Jhon Lids 09.05.2022 15:21

Извините, есть ли способ добавить во фрейм данных с коэффициентами другие столбцы со значениями t-статистики, R ^ 2 и R ^ 2 с поправкой на мою модель? Я имею в виду, что так же, как я получаю фрейм данных со всеми коэффициентами для всех периодов, мне нужно получить значения t-статистики, R ^ 2 и R ^ 2, скорректированные для всех периодов.

Jhon Lids 11.05.2022 12:10

Да, просто разверните, например. transmute(from, to, r2 = model %>% summary() pluck("r.squared")

danlooo 11.05.2022 13:22

Я попытался воспроизвести ваш код следующим образом: models %>% filter(!is.na(model)) %>% transmute( from, to, r2 = model %>% summary(), pluck("r.squared" )) %>% unnest_wider(r2) Но я не получил числовых результатов, только новый столбец с символьными значениями "r.squared".

Jhon Lids 12.05.2022 09:40

Делайте summary() %>% pluck("r.squared") вместо summary(), pluck("r.squared")

danlooo 12.05.2022 09:46
a_m <- models %>% filter(!is.na(model)) %>% transmute( from, to, r2 = model %>% summary() %>% pluck("r.squared") ) %>% unnest_wider(r2) Я получил этот код ошибки: Ошибка в "stop_subscript()": ! Невозможно создать подмножество несуществующих столбцов. x Столбец "r2" не существует.
Jhon Lids 12.05.2022 09:59

Другие вопросы по теме

Похожие вопросы

Почему эта функция минимальных значений selectizeInput не работает правильно для двузначных чисел, хотя она отлично работает для однозначных чисел?
Добавление первого, второго, третьего наблюдения во фрейм данных
Изменить форму кадра данных с широкого на длинный в R
Использование format() в R для преобразования числового значения в экспоненциальное представление после округления
Аккуратный способ фильтрации, но добавление дополнения в таблицу
R подсчет по столбцам и group_by по первому столбцу
Тесты с `expect_doppelganger()` терпят неудачу после обновления до R 4.2.0
Использовать Dplyr для расчета процентов по группам для каждого столбца без указания имени?
Вернуть имена фреймов данных из цикла в новый фрейм данных в виде идентификаторов
Как создать матрицу равномерно расположенных точек внутри углового многоугольника, учитывая угловые координаты [R]