การทำนายล่วงหน้า 1 ขั้นตอนด้วยแพ็คเกจ Dynlm R


11

ฉันพอดีกับโมเดลที่มีตัวแปรอิสระหลายตัวซึ่งหนึ่งในนั้นก็คือความล่าช้าของตัวแปรตามโดยใช้แพ็คเกจ dynlm

สมมติว่าฉันมีการคาดการณ์ล่วงหน้า 1 ขั้นตอนสำหรับตัวแปรอิสระของฉันฉันจะรับการคาดการณ์ล่วงหน้า 1 ขั้นตอนสำหรับตัวแปรตามของฉันได้อย่างไร

นี่คือตัวอย่าง:

library(dynlm)

y<-arima.sim(model=list(ar=c(.9)),n=10) #Create AR(1) dependant variable
A<-rnorm(10) #Create independant variables
B<-rnorm(10)
C<-rnorm(10)
y<-y+.5*A+.2*B-.3*C #Add relationship to independant variables 
data=cbind(y,A,B,C)

#Fit linear model
model<-dynlm(y~A+B+C+L(y,1),data=data)

#Forecast
A<-c(A,rnorm(1)) #Assume we already have 1-step forecasts for A,B,C
B<-c(B,rnorm(1))
C<-c(C,rnorm(1))
y=window(y,end=end(y)+c(1,0),extend=TRUE)
newdata<-cbind(y,A,B,C)
predict(model,newdata)

และนี่คือตัวอย่างการใช้แพคเกจ dyn ซึ่งใช้งานได้

library(dyn)

#Fit linear model
model<-dyn$lm(y~A+B+C+lag(y,-1),data=data)

#Forecast
predict(model,newdata)the dyn packages, which works:

การใช้dynlmแพคเกจเท่านั้นจะไม่ให้การคาดการณ์สำหรับตัวแปรตามของคุณ การจัดเตรียมการคาดการณ์สำหรับตัวแปรตามของคุณจะต้องมีแบบจำลองเพื่ออธิบายและอาจมีข้อมูลเพิ่มเติม ฉันขอแนะนำให้คุณอ่านบางอย่างเกี่ยวกับการถดถอยหลายตัวแปรเช่น "การวิเคราะห์เชิงสถิติหลายตัวแปรประยุกต์" โดย Johnson และ Wichern หรือหลักสูตรเกี่ยวกับการคาดการณ์: duke.edu/~rnau/411home.htm
deps_stats

1
@deps_stats ตัวแปรตามคือสิ่งที่ฉันต้องการคาดการณ์ ฉันสมมติว่าฉันได้คาดการณ์ตัวแปรอิสระแล้ว ในโค้ดตัวอย่างของฉัน y เป็นตัวแปรตามที่ฉันพยายามคาดการณ์และ A, B, C เป็นตัวแปรอิสระซึ่งฉันมีการคาดการณ์ไว้แล้ว หากคุณเรียกใช้โค้ดตัวอย่างที่ฉันโพสต์คุณจะเข้าใจลักษณะของปัญหาของฉัน
Zach

@Zach: คะแนน Kaggle ดี! (ฉันคลิกผ่านลิงก์ในโปรไฟล์วางเมาส์ของคุณ)
Hugh Perkins

คำตอบ:


13

ขอแสดงความยินดีคุณพบข้อผิดพลาด การคาดการณ์สำหรับdynlmข้อมูลใหม่จะใช้งานไม่ได้หากใช้ตัวแปรที่ล้าหลัง เพื่อดูว่าทำไมดูที่ผลลัพธ์ของ

predict(model)
predict(model,newdata=data)

ผลลัพธ์ควรเหมือนกัน แต่ไม่เหมือนกัน โดยไม่มีการnewdataโต้แย้งpredictฟังก์ชั่นโดยทั่วไปจะคว้าmodelองค์ประกอบจากการdynlmส่งออก ด้วยnewdataอาร์กิวเมนต์พยายามในรูปแบบเมทริกซ์รุ่นใหม่จากpredict newdataเนื่องจากสิ่งนี้เกี่ยวข้องกับการแยกวิเคราะห์สูตรที่จัดหาให้dynlmและสูตรมีฟังก์ชันLซึ่งกำหนดไว้เฉพาะภายในฟังก์ชันเท่านั้นdynlmจึงสร้างเมทริกซ์โมเดลที่ไม่ถูกต้อง หากคุณพยายามที่จะดีบั๊กคุณจะเห็นว่าตัวแปรที่ขึ้นกับความล่าช้านั้นไม่ได้อยู่ในกรณีที่มีการnewdataโต้แย้ง

newdataสิ่งที่คุณสามารถทำได้คือการล่าช้าตัวแปรตามและรวมไว้ใน นี่คือรหัสที่แสดงวิธีการนี้ ฉันใช้set.seedดังนั้นมันจะทำซ้ำได้ง่าย

library(dynlm)

set.seed(1)
y<-arima.sim(model=list(ar=c(.9)),n=10) #Create AR(1) dependant variable
A<-rnorm(10) #Create independant variables
B<-rnorm(10)
C<-rnorm(10)
y<-y+.5*A+.2*B-.3*C #Add relationship to independant variables 
data=cbind(y,A,B,C)

#Fit linear model
model<-dynlm(y~A+B+C+L(y,1),data=data)

นี่คือพฤติกรรมของบั๊กกี้:

> predict(model)
       2        3        4        5        6        7        8        9       10 
3.500667 2.411196 2.627915 2.813815 2.468595 1.733852 2.114553 1.423225 1.470738 
> predict(model,newdata=data)
        1         2         3         4         5         6         7         8         9        10 
2.1628335 3.7063579 2.9781417 2.1374301 3.2582376 1.9534558 1.3670995 2.4547626 0.8448223 1.8762437 

แบบฟอร์ม newdata

#Forecast fix.
A<-c(A,rnorm(1)) #Assume we already have 1-step forecasts for A,B,C
B<-c(B,rnorm(1))
C<-c(C,rnorm(1))

newdata<-ts(cbind(A,B,C),start=start(y),freq=frequency(y))

newdata<-cbind(lag(y,-1),newdata)
colnames(newdata) <- c("y","A","B","C")

เปรียบเทียบการคาดการณ์กับแบบจำลอง:

> predict(model)
       2        3        4        5        6        7        8        9       10 
3.500667 2.411196 2.627915 2.813815 2.468595 1.733852 2.114553 1.423225 1.470738 
> predict(model,newdata=newdata)
       1        2        3        4        5        6        7        8        9       10       11 
      NA 3.500667 2.411196 2.627915 2.813815 2.468595 1.733852 2.114553 1.423225 1.470738 1.102367 

ดังที่คุณสามารถดูข้อมูลประวัติการคาดการณ์เกิดขึ้นและองค์ประกอบสุดท้ายประกอบด้วยการคาดการณ์ล่วงหน้า 1 ขั้นตอน


คุณสามารถจัดการกรณีที่คุณมีสองล่าช้าในสูตรเดียวกันได้อย่างไร lag(y,-1)+lag(y,-2)?
Hugh Perkins

1
ถ้าอย่างนั้นวิธีนี้ไม่ได้ผล คุณต้องเขียนฟังก์ชันการทำนายของคุณเอง
mpiktas

อานั่นคือสิ่งที่ฉันทำจริง :-P
ฮิวจ์เพอร์กินส์

1
คุณพิจารณาส่งไปยังผู้เขียน dynlm หรือไม่? มันเป็นสถานการณ์ที่แปลกประหลาดที่คุณไม่สามารถคาดการณ์ได้โดยใช้ dynlm
mpiktas

อืมคุณกำลังบอกว่าพวกเขาจะไม่ตรวจสอบสแต็คโอเวอร์โฟลว์และแก้ไขข้อบกพร่องอย่างน่าอัศจรรย์ใช่ไหม ฉันเดาว่าคงเป็นจริง!
Hugh Perkins

2

การติดตามคำขอของ @ md-azimul-haque ฉันขุดผ่านซอร์สโค้ดอายุ 4 ปีของฉันและพบฟังก์ชั่นที่ตั้งชื่ออย่างเหมาะสมดังต่อไปนี้ ไม่แน่ใจว่านี่คือสิ่งที่ @ md-azimul-haque กำลังมองหาใช่ไหม

# pass in training data, test data,
# it will step through one by one
# need to give dependent var name, so that it can make this into a timeseries
predictDyn <- function( model, train, test, dependentvarname ) {
    Ntrain <- nrow(train)
    Ntest <- nrow(test)
    # can't rbind ts's apparently, so convert to numeric first
    train[,dependentvarname] <- as.numeric(train[,dependentvarname])
    test[,dependentvarname] <- NA
    testtraindata <- rbind( train, test )
    testtraindata[,dependentvarname] <- ts( as.numeric( testtraindata[,dependentvarname] ) )
    for( i in 1:Ntest ) {
       cat("predicting i",i,"of",Ntest,"\n")
       result <- predict(model,newdata=testtraindata,subset=1:(Ntrain+i-1))
       testtraindata[Ntrain+i,dependentvarname] <- result[Ntrain + i + 1 - start(result)][1]
    }
    testtraindata <- testtraindata[(Ntrain+1):(Ntrain + Ntest),dependentvarname]
    names(testtraindata) <- 1:Ntest
    return( testtraindata )
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.