Newey West Adjustment dans data.table
J'ai une table de données suivante
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
Ce que je veux être en mesure d'effectuer un test t pour rejeter la valeur nulle selon laquelle le rendement excédentaire moyen mensuel est nul et pour ce faire, je veux effectuer un ajustement de Newey West avec un décalage de 1 en erreurs. Je régresse donc le rendement excédentaire sur une constante groupée par mois et je fais un ajustement de Newey West.
Je veux enfin rapporter la statistique T ajustée de Newey West et le rendement excédentaire moyen mensuel pour chaque portefeuille.
Voici ce que j'ai fait:
TS_Sample_Beta_Portfolio_Final<-Sample_Beta_Portfolio_Final[,list(coeftest(lm(ExcessReturn~1),
vcov = NeweyWest(lm(ExcessReturn~1),lag = 12))),by=c("PrevMonth")]
où Sample_Beta_Portfolio contient les données ci-dessus.
Mais cela ne semble pas fonctionner.
Toute aide serait appréciée!
Réponses
Le problème est que votre listappel encapsule la sortie de l' coeftestintérieur d'une liste, c'est-à-dire une liste avec un élément de classe coeftest. Ce que vous voulez, à la place, est une liste avec chaque statistique individuelle produite par coeftest. Vous pouvez donc utiliser à la as.listplace:
Sample_Beta_Portfolio_Final[, as.list(coeftest(lm(ExcessReturn~1),
vcov=NeweyWest(lm(ExcessReturn~1),
lag=12))),
by=c("PrevMonth")]
Le problème avec cette approche est qu'elle ne nommera pas correctement votre résultat, car elle as.listsupprime votre fichier dimnames. Une alternative serait d'écrire une fitfonction qui renomme la liste de sortie.
Tout d'abord, chargez les bibliothèques et les données:
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")
Ensuite, définissez la fitfonction et appliquez-la à chaque groupe:
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
Notez que cela produira des avertissements car vous spécifiez plus de retards qu'il n'y a d'observations dans chaque groupe.