У меня есть ежемесячные данные для каждой группы, и я хочу сделать регрессию для каждой группы, а окно 2 года и получит уклон.

Я попробовал несколько методов

  1. Я пытался использовать для петли и фильтра 2 года каждый раз, затем DO LM
df$Year =year(df$date)
df1<-purrr::map_df(min(df$Year):(max(df$Year) - 2), function(i) {
             df %>%
              filter(Year%in% c(i,i+1)) %>%
              group_by(group)%>%
    do(lm = lm(R ~ M, data = .,na.action=na.exclude)) %>%
      mutate(lm_b0 = summary(lm)$coeff[1],
             lm_b1 = summary(lm)$coeff[2])%>%
    ungroup()
  })

Получите ошибку:

Ошибка в lm.fit (x, y, offset = offset, singular.ok = singular.ok, ...): 0 (не-NA) случаев

  1. Затем я попытался определить наклон функции, но результат DF1, колонна «наклон» - это все NA
slope <- . %>% { cov(.[, 2], .[, 1]) / var(.[, 2])}
df1<-df %>%
       group_by(group,Year) %>%
       mutate(slope = rollapplyr(cbind(R, M), 2, slope, by.column = FALSE, fill = NA)) %>%ungroup()
  1. И я нашел метод Roll_lm:
library(roll)
df1<-df%>%
  group_by(group,Year)%>%
  roll_lm(MKT,RET,2)

Получите ошибку:

Ошибка в Roll_LM (., M, R, 5): объект «M» не найден

4. Я попробовал это, но результат все на

df1<-df%>%
  group_by(group,Year)%>%
  do(data.frame(., rolling_coef = rollapplyr(data = ., width = 2, FUN = function(df_) {
    mod = lm(R ~ M, data = .)
    return(coef(mod)[2])
  }, by.column = FALSE, fill = NA)))

Я также попробовал использовать {{x0}} напрямую, он может работать, но кажется, что бета - для неотрицательной числовой переменной, мой M и R имеют отрицательное значение.

Может ли кто-нибудь дать мне несколько идей? Спасибо!

Мой набор данных похож на этот: введите здесь описание изображения

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

r
1
ling 8 Окт 2020 в 18:20

1 ответ

Лучший ответ

Возможно, вы хотите это.

res <- do.call(rbind, lapply(0:6, function(y) 
  do.call(rbind, by(d, d$g, function(g) {
    b <- unname(lm(R ~ M, g[substr(g$t, 1, 4) %in% (2000:2001 + y), ])$coe)
    data.frame(group=g$g[[1]], date=2002 + y, b0=b[1], b1=b[2])
  }))
  ))
res
#    group date          b0          b1
# a      a 2002  0.11269711  0.50982041
# b      b 2002 -0.18383806  0.77395640
# a1     a 2003 -0.04830032  0.38158442
# b1     b 2003  0.05165555 -0.02668866
# a2     a 2004  0.04793637 -0.15872739
# b2     b 2004  0.27075037 -0.28167401
# a3     a 2005 -0.17276432 -0.41435303
# b3     b 2005  0.21656421 -0.22557376
# a4     a 2006 -0.29442007  0.45387752
# b4     b 2006 -0.02507721 -0.09527979
# a5     a 2007 -0.11417319  0.54403146
# b5     b 2007 -0.34265074 -0.33346084
# a6     a 2008 -0.13838241  0.33467995
# b6     b 2008 -0.02713155  0.25299279

< EM> Данные:

set.seed(42)
d <- expand.grid(g=letters[1:2], t=seq(as.Date("2000-01-01"), length.out=96, by="m"),
                 stringsAsFactors=F)
d <- transform(d, R=round(rnorm(nrow(d)), 2), M=round(rnorm(nrow(d))/2, 2))
1
jay.sf 8 Окт 2020 в 16:53