Newey West Adjustment di data.table

Oct 21 2020

Saya memiliki data.table berikut

PrevMonth   Portfolio   ExcessReturn
196306  Portfolio 1 -0.3035362
196306  Portfolio 10    -1.250766
196306  Portfolio 2 1.08474287
196306  Portfolio 3 -0.628247
196306  Portfolio 4 -0.2490027
196306  Portfolio 5 0.47310531
196306  Portfolio 6 0.36409036
196306  Portfolio 7 -0.8392494
196306  Portfolio 8 -0.5734843
196306  Portfolio 9 -1.9914358
196306  Portfolio LS    -0.9472298
196307  Portfolio 1 3.29524841
196307  Portfolio 10    6.47879571
196307  Portfolio 2 2.8880775
196307  Portfolio 3 4.35083011
196307  Portfolio 4 4.2523679
196307  Portfolio 5 4.30965798
196307  Portfolio 6 4.68137361
196307  Portfolio 7 4.34311633
196307  Portfolio 8 7.04824776
196307  Portfolio 9 7.35395871
196307  Portfolio LS    3.18354731
196308  Portfolio 1 -0.4837659
196308  Portfolio 10    -0.8704307
196308  Portfolio 2 -1.8642527

Apa yang saya inginkan untuk dapat melakukan uji-t untuk menolak nol bahwa Pengembalian Kelebihan Rata-Rata Bulanan adalah nol dan untuk melakukannya saya ingin membuat Penyesuaian Newey West dengan kelambatan 1 dalam kesalahan. Jadi saya kemunduran Kelebihan Pengembalian pada konstanta yang dikelompokkan berdasarkan Bulan dan membuat penyesuaian Newey West.

Saya akhirnya ingin melaporkan statistik-t Newey West Adjusted dan pendapatan berlebih rata-rata bulanan untuk setiap portofolio.

Inilah yang telah saya lakukan:

TS_Sample_Beta_Portfolio_Final<-Sample_Beta_Portfolio_Final[,list(coeftest(lm(ExcessReturn~1),
                                  vcov = NeweyWest(lm(ExcessReturn~1),lag = 12))),by=c("PrevMonth")]

di mana Sample_Beta_Portfolio memiliki data di atas.

Tapi ini sepertinya tidak berhasil.

Bantuan apa pun akan dihargai!

Jawaban

Vincent Oct 22 2020 at 01:29

Masalahnya adalah bahwa listpanggilan Anda merangkum keluaran dari coeftestdalam daftar, yaitu daftar dengan satu elemen kelas coeftest. Yang Anda inginkan, sebaliknya, adalah daftar dengan masing-masing statistik dibuat oleh coeftest. Jadi, Anda dapat menggunakan as.list:

Sample_Beta_Portfolio_Final[, as.list(coeftest(lm(ExcessReturn~1), 
                                               vcov=NeweyWest(lm(ExcessReturn~1), 
                                                              lag=12))),
                            by=c("PrevMonth")]

Masalah dengan pendekatan ini adalah bahwa itu tidak akan memberi nama hasil Anda dengan benar, karena as.listmenjatuhkan Anda dimnames. Alternatifnya adalah menulis fitfungsi yang mengganti nama daftar output.

Pertama, muat pustaka dan datanya:

library(data.table)
library(sandwich)
library(lmtest)

dat = fread("PrevMonth -Portfolio   ExcessReturn
196306-Portfolio 1 -0.3035362
196306-Portfolio 10    -1.250766
196306-Portfolio 2 1.08474287
196306-Portfolio 3 -0.628247
196306-Portfolio 4 -0.2490027
196306-Portfolio 5 0.47310531
196306-Portfolio 6 0.36409036
196306-Portfolio 7 -0.8392494
196306-Portfolio 8 -0.5734843
196306-Portfolio 9 -1.9914358
196306-Portfolio LS    -0.9472298
196307-Portfolio 1 3.29524841
196307-Portfolio 10    6.47879571
196307-Portfolio 2 2.8880775
196307-Portfolio 3 4.35083011
196307-Portfolio 4 4.2523679
196307-Portfolio 5 4.30965798
196307-Portfolio 6 4.68137361
196307-Portfolio 7 4.34311633
196307-Portfolio 8 7.04824776
196307-Portfolio 9 7.35395871
196307-Portfolio LS    3.18354731
196308-Portfolio 1 -0.4837659
196308-Portfolio 10    -0.8704307
196308-Portfolio 2 -1.8642527")

Kemudian, tentukan fitfungsinya dan terapkan ke setiap grup:

fit = function(x) {
  m = lm(ExcessReturn~1, x)
  v = NeweyWest(m, lag=12)
  ct = coeftest(m, vcov=v)
  out = as.list(ct)
  names(out) = dimnames(ct)[[2]]
  out[["r2"]] = summary(m)$r.squared
  out
}

dat[, fit(.SD), by="PrevMonth"]

#>           PrevMonth   Estimate Std. Error   t value     Pr(>|t|) r2
#> 1: 196306-Portfolio -0.4419102  0.1596251 -2.768425 1.984085e-02  0
#> 2: 196307-Portfolio  4.7441110  0.2203860 21.526374 1.044449e-09  0
#> 3: 196308-Portfolio -1.0728164  0.1614823 -6.643553 2.191480e-02  0

Perhatikan bahwa ini akan menghasilkan peringatan karena Anda menentukan lebih banyak kelambatan daripada yang ada pengamatan di setiap grup.