Data.table'da Newey West Ayarı
Aşağıdaki data.table bende var
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
Aylık Ortalama Fazla Getirinin sıfır olduğu null değerini reddetmek için bir t-testi yapabilmek ve bunu yapmak için, hatalarda 1 gecikme ile bir Newey West Ayarı yapmak istiyorum. Bu yüzden, Fazla Getiriyi Ay'a göre gruplanmış bir sabit üzerinde geriletiyorum ve Newey West ayarlaması yapıyorum.
Sonunda, Newey West Adjusted t-istatistiğini ve her portföy için aylık ortalama fazla getiri rapor etmek istiyorum.
İşte yaptığım şey:
TS_Sample_Beta_Portfolio_Final<-Sample_Beta_Portfolio_Final[,list(coeftest(lm(ExcessReturn~1),
vcov = NeweyWest(lm(ExcessReturn~1),lag = 12))),by=c("PrevMonth")]
Sample_Beta_Portfolio yukarıdaki verilere sahiptir.
Ama bu işe yaramıyor gibi görünüyor.
Herhangi bir yardım memnuniyetle karşılanacaktır!
Yanıtlar
Sorun, listaramanızın coeftestbir listenin, yani bir sınıf öğesi içeren bir listenin çıktısını sarmalamasıdır coeftest. Bunun yerine, istediğiniz her bir istatistiğin ürettiği bir listedir coeftest. Yani as.listbunun yerine şunları kullanabilirsiniz :
Sample_Beta_Portfolio_Final[, as.list(coeftest(lm(ExcessReturn~1),
vcov=NeweyWest(lm(ExcessReturn~1),
lag=12))),
by=c("PrevMonth")]
Bu yaklaşımdaki sorun çünkü, düzgün sonucu isim olmaz olmasıdır as.listsenin düşer dimnames. Bir alternatif fit, çıktı listesini yeniden adlandıran bir işlev yazmak olabilir .
İlk olarak, kitaplıkları ve verileri yükleyin:
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")
Daha sonra fitişlevi tanımlayın ve her gruba uygulayın:
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
Her gruptaki gözlemlerden daha fazla gecikme belirttiğiniz için bunun uyarılar üreteceğini unutmayın.