/ / Rolling regression z dplyr i lsfit - r, dplyr, regression, zoo

Rolling regresji z dplyr i lsfit - r, dplyr, regression, zoo

Próbuję uruchomić regresję toczenia dplyr. Używam rollapplyr z pakietu zoo i lsfit ponieważ interesuje mnie tylko beta regresji. Oto, co próbowałem:

library(dplyr); library(zoo)

df1 = expand.grid(site = seq(10),
year = 2000:2004,
day = 1:50)

df1 %>%
group_by(year) %>%
mutate(beta1 = rollapplyr(data = site,
width = 5,
FUN = lsfit,
x=day))

Otrzymuję ten błąd: Error: not all arguments have the same length

Myślę rollapplyr akceptuje obiekty inne niż zoo, ale mogę się mylić. Może być również tak, że orurowanie (%>%) nie gra dobrze rollapplyr ponieważ wymaga obiektu danych w funkcji.

Dowolny pomysł?

EDYTOWAĆ Moje pytanie różni się od: regresja krocząca z dplyr Chcę używać rur w celu użycia group_by

Odpowiedzi:

3 dla odpowiedzi № 1

Funkcja nie przechodzi przez wiele wektorów. W plasterkach site wektor jest porównywany z pełny wektor day. Możemy napisać naszą własną funkcję toczenia stosowania za pomocą Map przejść przez grupy naszego wektora:

rollapplydf <- function(xx, width) {
l <- length(xx)
sq <- Map(":", 1:(l-width+1), width:l)
lst <- lapply(sq, function(i) lm(xx[i] ~ seq(length(xx[i])))$coeff[2] )
do.call("rbind", c(rep(NA, width-1L), lst))
}

Możemy więc dodać to do rury:

library(dplyr)
df1 %>%
group_by(year) %>%
mutate(beta1 = rollapplydf(xx = site, width = 5) )

# Source: local data frame [2,500 x 4]
# Groups: year [5]
#
#     site  year   day beta1
#    (int) (int) (int) (dbl)
# 1      1  2000     1    NA
# 2      2  2000     1    NA
# 3      3  2000     1    NA
# 4      4  2000     1    NA
# 5      5  2000     1     1
# 6      6  2000     1     1
# 7      7  2000     1     1
# 8      8  2000     1     1
# 9      9  2000     1     1
# 10    10  2000     1     1
# ..   ...   ...   ...   ...