Dynlm R paketi ile 1 adım önde tahminler


11

Biri bağımlı değişkenin gecikmesi olan dynlm paketini kullanarak birkaç bağımsız değişken içeren bir modele uyuyorum.

Bağımsız değişkenlerim için 1 adım önde tahminlerim olduğunu varsayarsak, bağımlı değişkenlerim için 1 adım önde tahminler nasıl alabilirim?

İşte bir örnek:

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)

Ve işte çalışan dyn paketini kullanan bir örnek.

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:

Yalnızca dynlmpaket kullanmak bağımlı değişkenleriniz için tahmin sağlamaz. Bağımlı değişkenleriniz için tahmin sağlamak, bunları açıklamak için bir model ve muhtemelen ek veriler gerektirir. Johnson ve Wichern'in "Uygulamalı Çok Değişkenli İstatistiksel Analiz" gibi çok değişkenli regresyon hakkında bir şeyler okumanızı öneririm. veya tahmin üzerine bir kurs: duke.edu/~rnau/411home.htm
deps_stats

1
@deps_stats Bağımlı değişken tahmin etmek istediğim şeydir. Bağımsız değişkenlerim için zaten tahminlerim olduğunu varsayıyorum. Örnek kodumda, y tahmin etmeye çalıştığım bağımlı değişken ve A, B, C zaten önceden tahmin ettiğim bağımsız değişkenlerdir. Gönderdiğim örnek kodu çalıştırırsanız, sorunumun doğasını anlayacaksınız.
Zach

@Zach: Güzel Kaggle derecesi! (Fareyle üzerine
gelme

Yanıtlar:


13

Tebrikler, bir hata buldunuz. dynlmGecikmeli değişkenler kullanılırsa yeni verilerle ilgili tahmin bozulur. Neden çıktısına bakmak için

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

Sonuçlar aynı olmalı, ancak değil. newdataBağımsız değişken olmadan , predictişlev temel olarak modelöğeyi dynlmçıktıdan alır. newdataArgüman ile predictyeni model matrisi oluşturmaya çalışır newdata. Bu, verilen formülü ayrıştırmayı içerdiğinden dynlmve formülün Lyalnızca işlev içinde dahili olarak tanımlanan bir işleve sahip dynlmolduğundan, yanlış model matrisi oluşur. Hata ayıklamaya çalışırsanız, newdataargüman sağlandığında gecikmeli bağımlı değişkenin gecikmediğini göreceksiniz .

Yapabileceğiniz şey bağımlı değişkeni geciktirmek ve içine eklemek newdata. İşte bu yaklaşımı gösteren kod. Kullandığım set.seedkolayca tekrarlanabilir olurdu böylece.

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)

Buggy davranışı:

> 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 

Biçimlendirmek 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")

Tahmini model uyumluluğuyla karşılaştırın:

> 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 

Geçmiş veriler için görebileceğiniz gibi tahmin çakışıyor ve son öğe 1 adım ileriye dönük tahmin içeriyor.


Aynı formülde iki gecikmenin olduğu durumu nasıl ele alabilirsiniz? lag(y,-1)+lag(y,-2)?
Hugh Perkins

1
O zaman bu çözüm işe yaramıyor. Kendi tahmin fonksiyonunuzu yazmanız gerekir.
mpiktas

Ah, aslında bunu yaptım :-P
Hugh Perkins

1
Bunu dynlm yazarlarına göndermeyi düşündünüz mü? Dynlm kullanmayı tahmin edemediğiniz tuhaf bir durumdur.
mpiktas

Hmmm, yığın akışını sihirli bir şekilde izlemeyecek ve hataları düzeltmeyeceklerini mi söylüyorsunuz? Sanırım bu muhtemelen doğru!
Hugh Perkins

2

@ Md-azimul-haque'nin isteğini takiben, 4 yıllık kaynak kodumu kazdım ve aşağıdaki uygun adlandırılmış işlevi buldum. @ Md-azimul-haque'ın aradığından emin değil misiniz?

# 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 )
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.