Newey West Adjustment ใน data.table
ฉันมี data.table ต่อไปนี้
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
สิ่งที่ฉันต้องการให้สามารถทำการทดสอบ t เพื่อปฏิเสธโมฆะที่ผลตอบแทนส่วนเกินเฉลี่ยรายเดือนเป็นศูนย์และฉันต้องการทำการปรับปรุง Newey West โดยมีข้อผิดพลาดล่าช้า 1 ดังนั้นฉันจึงถดถอยผลตอบแทนส่วนเกินของค่าคงที่ที่จัดกลุ่มตามเดือนและทำการปรับ Newey West
ในที่สุดฉันก็ต้องการรายงานสถิติ t ของ Newey West ที่ปรับแล้วและผลตอบแทนส่วนเกินเฉลี่ยรายเดือนสำหรับแต่ละพอร์ตโฟลิโอ
นี่คือสิ่งที่ฉันได้ทำ:
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 มีข้อมูลข้างต้น
แต่ดูเหมือนจะไม่ได้ผล
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม!
คำตอบ
ปัญหาคือว่าคุณlistโทรสุนทรีย์เอาท์พุทของภายในรายการที่เป็นรายการที่มีองค์ประกอบหนึ่งของชั้นเรียนcoeftest สิ่งที่คุณต้องการแทนที่จะเป็นรายการที่มีสถิติแต่ละบุคคลที่ผลิตโดยcoeftest coeftestดังนั้นคุณสามารถใช้as.listแทน:
Sample_Beta_Portfolio_Final[, as.list(coeftest(lm(ExcessReturn~1),
vcov=NeweyWest(lm(ExcessReturn~1),
lag=12))),
by=c("PrevMonth")]
ปัญหาเกี่ยวกับวิธีนี้คือมันจะตั้งชื่อผลลัพธ์ของคุณไม่ถูกต้องเนื่องจากas.listทำให้dimnamesไฟล์. อีกทางเลือกหนึ่งคือการเขียนfitฟังก์ชันที่เปลี่ยนชื่อรายการผลลัพธ์
ขั้นแรกให้โหลดไลบรารีและข้อมูล:
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")
จากนั้นกำหนดfitฟังก์ชันและนำไปใช้กับแต่ละกลุ่ม:
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
โปรดทราบว่าสิ่งนี้จะทำให้เกิดคำเตือนเนื่องจากคุณระบุความล่าช้ามากกว่าที่มีการสังเกตในแต่ละกลุ่ม