пожалуйста, посмотрите на обновленный вопрос. Спасибо!!

много вопросов о скользящей регрессии в R, но здесь я специально ищу что-то, что используетdplyr, broom и (при необходимости)purrr.

Это то, что делает этот вопрос другим. я хочу бытьtidyverse последовательны. Можно ли сделать правильную регрессию с помощью таких инструментов, какpurrr:map а такжеdplyr?

Пожалуйста, рассмотрите этот простой пример:

library(dplyr)
library(purrr)
library(broom)
library(zoo)
library(lubridate)

mydata = data_frame('group' = c('a','a', 'a','a','b', 'b', 'b', 'b'),
                     'y' = c(1,2,3,4,2,3,4,5),
                     'x' = c(2,4,6,8,6,9,12,15),
                     'date' = c(ymd('2016-06-01', '2016-06-02', '2016-06-03', '2016-06-04',
                                    '2016-06-03', '2016-06-04', '2016-06-05','2016-06-06')))

  group     y     x date      
  <chr> <dbl> <dbl> <date>    
1 a      1.00  2.00 2016-06-01
2 a      2.00  4.00 2016-06-02
3 a      3.00  6.00 2016-06-03
4 a      4.00  8.00 2016-06-04
5 b      2.00  6.00 2016-06-03
6 b      3.00  9.00 2016-06-04
7 b      4.00 12.0  2016-06-05
8 b      5.00 15.0  2016-06-06

Для каждой группы (в этом примереa или жеb):

вычислитьпрокатка регрессияy наx за последние 2 наблюдения.сохранить коэффициент этой скользящей регрессии в столбце данных.

Конечно, как вы можете видеть, скользящая регрессия может быть вычислена только для последних 2 строк в каждой группе.

Я пытался использовать следующее, но безуспешно.

data %>% group_by(group) %>% 
  mutate(rolling_coef = do(tidy(rollapply(. ,
                    width=2, 
                    FUN = function(df) {t = lm(formula=y ~ x, 
                                              data = as.data.frame(df), 
                                              na.rm=TRUE); 
                    return(t$coef) },
                    by.column=FALSE, align="right"))))
Error in mutate_impl(.data, dots) : 
  Evaluation error: subscript out of bounds.
In addition: There were 21 warnings (use warnings() to see them)

Есть идеи?

Ожидаемый результат для двух последних строк первогоa группа составляет 0,5 и 0,5 (действительно существует идеальная линейная корреляция междуy а такжеx в этом примере)

Более конкретно:

mydata_1 <- mydata %>% filter(group == 'a',
                  row_number() %in% c(1,2))
# A tibble: 2 x 3
  group     y     x
  <chr> <dbl> <dbl>
1 a      1.00  2.00
2 a      2.00  4.00
> tidy(lm(y ~ x, mydata_1))['estimate'][2,]
[1] 0.5

а также

mydata_2 <- mydata %>% filter(group == 'a',
                              row_number() %in% c(2,3)) 
# A tibble: 2 x 3
  group     y     x
  <chr> <dbl> <dbl>
1 a      2.00  4.00
2 a      3.00  6.00
> tidy(lm(y ~ x, mydata_2))['estimate'][2,]
[1] 0.5

РЕДАКТИРОВАТЬ:

интересное продолжение этого вопроса здесьскользящая регрессия с доверительным интервалом (Tidyverse)

Ответы на вопрос(0)

Ваш ответ на вопрос