R - регрессия plm со временем в формате posix

У меня мало опыта работы с панельными данными в R, и я пытаюсь запустить простую регрессию панелей с пакетом plm. Однако при преобразовании моего фрейма данных в pdata.frame моя временная индексная переменная преобразуется в факторную переменную. Это означает, что если я хочу регрессировать зависимую переменную как функцию времени, регрессия генерирует длинный список фиктивных переменных для времени и вычисляет индивидуальные коэффициенты для каждой. Мне просто нужен средний эффект за единицу времени (т.е. среднемесячное увеличение / уменьшение в пунктах).

Пример фрейма данных:

ID    Date        Points
1     1/11/2014   2
1     1/12/2014   4
1     1/1/2015    6
1     1/2/2015    8
2     1/11/2014   1
2     1/12/2014   2
2     1/1/2015    3
2     1/2/2015    4

Скажем, в примере структуры фрейма данных ID = int, Date = POSIXct, Points = int. Затем я конвертирую его в pdata.frame с идентификатором индекса и датой:

panel <- pdata.frame(dataframe, c("ID", "Date"))

И запустите регрессию с фиксированными эффектами plm:

fixed <- plm(Points ~ Date, data=panel, model="within")
summary(fixed)

Полученные в результате коэффициенты затем разбиваются по месяцам как фиктивные. Я хочу рассматривать свою временную переменную как непрерывную переменную, поэтому я получаю только один коэффициент для даты. Как я могу это сделать? Есть ли способ избежать форматирования переменной индекса времени как фактора в фреймах данных панели?


person ageil    schedule 02.08.2015    source источник


Ответы (1)


Я думаю, вам нужно создать отдельные часы или счетчик времени из panel$Date для использования в вашей модели. Например:

library(dplyr)
dataframe <- dataframe %>%
    group_by(ID) %>%
    mutate(clock = seq_along(ID))
panel <- pdata.frame(dataframe, c("ID", "Date"))

Это дает эти данные:

             ID       Date Points clock
1-2014-11-01  1 2014-11-01      2     1
1-2014-12-01  1 2014-12-01      4     2
1-2015-01-01  1 2015-01-01      6     3
1-2015-02-01  1 2015-02-01      8     4
2-2014-11-01  2 2014-11-01      1     1
2-2014-12-01  2 2014-12-01      2     2
2-2015-01-01  2 2015-01-01      3     3
2-2015-02-01  2 2015-02-01      4     4

Это дает такой результат:

> fixed <- plm(Points ~ clock, data=panel, model="within")
> summary(fixed)
Oneway (individual) effect Within Model

Call:
plm(formula = points ~ clock, data = panel, model = "within")

Balanced Panel: n=2, T=4, N=8

Residuals :
   Min. 1st Qu.  Median 3rd Qu.    Max. 
 -0.750  -0.375   0.000   0.375   0.750 

Coefficients :
      Estimate Std. Error t-value Pr(>|t|)   
clock  1.50000    0.22361  6.7082 0.001114 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Total Sum of Squares:    25
Residual Sum of Squares: 2.5
R-Squared      :  0.9 
      Adj. R-Squared :  0.5625 
F-statistic: 45 on 1 and 5 DF, p-value: 0.0011144
person ulfelder    schedule 02.08.2015
comment
Может ли тот, кто проголосовал против этого ответа, объяснить, почему? - person ulfelder; 02.08.2015
comment
Спасибо за ответ, хотя, похоже, вся ветка получила отрицательные голоса. Решение seq_along - хорошая идея и работает для моего упрощенного примера набора данных, но что, если набор данных имеет разное время начала и окончания? Скажем, id = 2 вместо этого сначала наблюдалось 1/12/2014 и последний раз наблюдалось 1/3/2014, тогда переменная часов установила бы оба (id = 1, date = 2014-11-01) и (id = 2, date = 2014-12-01) как часы = 1. Есть ли способ лучше? - person ageil; 02.08.2015
comment
Это зависит от того, какие отношения между временем и точками вы хотите исследовать. Если вы думаете, что конкретные даты имеют значение, тогда ваша исходная модель действительно подходит. Если с начала наблюдения прошло время, то предлагаемый мной подход будет работать нормально, даже если даты начала различаются. Если это что-то еще, вам понадобится другой подход. - person ulfelder; 02.08.2015
comment
Хорошие моменты. Я на самом деле думаю, что конкретные даты имеют значение в том смысле, что более высокие баллы более вероятны с более поздними датами. На данный момент я просто пытаюсь воссоздать результаты, полученные в Stata. Ваш подход очень близок к этим результатам, но Stata, похоже, может обрабатывать разное время начала и окончания без создания фиктивных переменных, которые, как я считаю, имеют значение. - person ageil; 02.08.2015
comment
@ulfeledr Похоже, вы хорошо разбираетесь в Stata и R. Не могли бы вы помочь мне перевести похожий код Stata на R? Большое спасибо. - person Econ_Spectre; 23.01.2020
comment
@Econ_Spectre, я не уверен, откуда у вас сложилось впечатление, что я хорошо разбираюсь в Stata, но это не так. Не использовал его десятилетиями. Удачи. - person ulfelder; 23.01.2020