Dự đoán trước 1 bước với gói R dynlm


11

Tôi đã điều chỉnh một mô hình với một số biến độc lập, một trong số đó là độ trễ của biến phụ thuộc, sử dụng gói dynlm.

Giả sử tôi có các dự báo trước 1 bước cho các biến độc lập của mình, làm cách nào để tôi có được các dự báo trước 1 bước cho các biến phụ thuộc của mình?

Đây là một ví dụ:

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)

Và đây là một ví dụ sử dụng gói dyn, hoạt động.

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:

Chỉ sử dụng dynlmgói sẽ không cung cấp dự báo cho các biến phụ thuộc của bạn. Cung cấp dự báo cho các biến phụ thuộc của bạn sẽ yêu cầu một mô hình để giải thích chúng và có thể là dữ liệu bổ sung. Tôi đề nghị bạn nên đọc một cái gì đó về hồi quy đa biến, chẳng hạn như "Phân tích thống kê đa biến ứng dụng" của Johnson và Wicotta. hoặc một khóa học về dự báo: duke.edu/~rnau/411home.htmlm
deps_stats

1
@deps_stats Biến phụ thuộc là những gì tôi muốn dự báo. Tôi giả sử rằng tôi đã có dự báo cho các biến độc lập của mình. Trong mã ví dụ của tôi, y là biến phụ thuộc mà tôi đang cố gắng dự báo và A, B, C là các biến độc lập mà tôi đã có dự báo. Nếu bạn chạy mã ví dụ tôi đã đăng, bạn sẽ hiểu bản chất của vấn đề của tôi.
Zach

@Zach: Đánh giá Kaggle đẹp! (Tôi đã nhấp qua liên kết trong hồ sơ di chuột của bạn)
Hugh Perkins

Câu trả lời:


13

Xin chúc mừng, bạn đã tìm thấy một lỗi. Dự đoán dynlmvới dữ liệu mới bị phá vỡ nếu các biến bị trễ được sử dụng. Để xem tại sao nhìn vào đầu ra của

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

Các kết quả nên giống nhau, nhưng chúng thì không. Không có newdatađối số, predicthàm về cơ bản lấy modelphần tử từ dynlmđầu ra. Với newdatađối số predictcố gắng hình thành ma trận mô hình mới từ newdata. Vì điều này liên quan đến công thức phân tích cú pháp được cung cấp cho dynlmvà công thức có chức năng L, chỉ được xác định trong hàm dynlm, nên ma trận mô hình không chính xác được hình thành. Nếu bạn cố gắng gỡ lỗi, bạn sẽ thấy, biến phụ thuộc bị trễ không bị trễ trong trường hợpnewdata đối số được cung cấp.

Những gì bạn có thể làm là để trễ biến phụ thuộc và đưa nó vào newdata. Đây là mã minh họa cho phương pháp này. Tôi sử dụng set.seedđể nó sẽ dễ dàng tái sản xuất.

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)

Đây là hành vi lỗi:

> 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 

Hình thành 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")

So sánh dự báo với mô hình phù hợp:

> 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 

Như bạn có thể thấy đối với dữ liệu lịch sử, dự báo trùng khớp và phần tử cuối cùng chứa dự báo trước 1 bước.


Làm thế nào bạn có thể xử lý trường hợp bạn có hai độ trễ trong cùng một công thức? lag(y,-1)+lag(y,-2)?
Hugh Perkins

1
Chà, giải pháp này không hiệu quả. Bạn cần phải viết chức năng dự đoán của riêng bạn.
mpiktas

À, đó là những gì tôi đã làm trong thực tế :-P
Hugh Perkins

1
Bạn đã xem xét việc gửi nó cho các tác giả dynlm? Đó là một tình huống kỳ quái, mà bạn không thể dự đoán bằng cách sử dụng dynlm.
mpiktas

Hmmm, bạn đang nói rằng họ sẽ không theo dõi một cách kỳ diệu stackoverflow và sửa lỗi? Tôi đoán đó có lẽ là sự thật!
Hugh Perkins

2

Theo yêu cầu của @ md-azimul-haque, tôi tìm hiểu mã nguồn 4 năm tuổi của mình và tìm thấy hàm được đặt tên thích hợp sau đây. Không chắc chắn nếu đây là những gì @ md-azimul-haque đang tìm kiếm?

# 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 )
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.