ЭТО МОИ ДАННЫЕ
У меня есть данные панели в 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, независимо от наблюдений.
Я надеюсь, что это было хорошо понято.
Вы можете создать несколько линейных моделей для заданного интервала дат следующим образом:
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()
Извините, есть ли способ добавить во фрейм данных с коэффициентами другие столбцы со значениями t-статистики, R ^ 2 и R ^ 2 с поправкой на мою модель? Я имею в виду, что так же, как я получаю фрейм данных со всеми коэффициентами для всех периодов, мне нужно получить значения t-статистики, R ^ 2 и R ^ 2, скорректированные для всех периодов.
Да, просто разверните, например. transmute(from, to, r2 = model %>% summary() pluck("r.squared")
Я попытался воспроизвести ваш код следующим образом: models %>% filter(!is.na(model)) %>% transmute( from, to, r2 = model %>% summary(), pluck("r.squared" )) %>% unnest_wider(r2) Но я не получил числовых результатов, только новый столбец с символьными значениями "r.squared".
Делайте summary() %>% pluck("r.squared")
вместо summary(), pluck("r.squared")
a_m <- models %>% filter(!is.na(model)) %>% transmute( from, to, r2 = model %>% summary() %>% pluck("r.squared") ) %>% unnest_wider(r2)
Я получил этот код ошибки: Ошибка в "stop_subscript()": ! Невозможно создать подмножество несуществующих столбцов. x Столбец "r2" не существует.
Большое спасибо!! Вы поместили некоторые команды, которых я не знал, но ваш код отлично работал, когда я просмотрел эти команды. Спасибо еще раз.