Dynlm R पैकेज के साथ 1-चरण-आगे की भविष्यवाणियाँ


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)

और यहां डायन पैकेज का उपयोग करके एक उदाहरण है, जो काम करता है।

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पैकेज का उपयोग करना आपके आश्रित चर के लिए पूर्वानुमान प्रदान नहीं करेगा। अपने आश्रित चर के लिए पूर्वानुमान प्रदान करने के लिए उन्हें समझाने के लिए एक मॉडल और शायद अतिरिक्त डेटा की आवश्यकता होगी। मेरा सुझाव है कि आप जॉनसन और विचर्न द्वारा "एप्लाइड मल्टीवेरेट सांख्यिकीय विश्लेषण" जैसे बहुभिन्नरूपी प्रतिगमन के बारे में कुछ पढ़ें। या पूर्वानुमान पर एक कोर्स: duke.edu/~rnau/411home.htm
deps_stats

1
@deps_stats आश्रित चर वह है जो मैं पूर्वानुमान करना चाहता हूं। मैं मान रहा हूं कि मेरे पास अपने स्वतंत्र चर के लिए पहले से ही पूर्वानुमान हैं। मेरे उदाहरण कोड में, y आश्रित चर है जिसका मैं पूर्वानुमान लगाने की कोशिश कर रहा हूं, और A, B, C स्वतंत्र चर हैं, जिनके लिए मेरे पास पहले से ही पूर्वानुमान हैं। यदि आप मेरे द्वारा पोस्ट किया गया उदाहरण कोड चलाते हैं, तो आप मेरी समस्या की प्रकृति को समझेंगे।
Zach

@Zach: नाइस कागल रेटिंग! (मैंने आपके माउस-ओवर प्रोफ़ाइल में लिंक पर क्लिक किया)
ह्यूग पर्किंस

जवाबों:


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)?
ह्यू पेर्किंस

1
खैर, फिर यह समाधान काम नहीं करता है। आपको अपनी खुद की भविष्यवाणी फ़ंक्शन लिखने की आवश्यकता है।
एमपिकेटस

आह, यही मैंने वास्तव में किया था :-P
ह्यूग पर्किन्स

1
क्या आपने इसे dynlm लेखकों को प्रस्तुत करने पर विचार किया? यह एक विचित्र स्थिति है, कि आप dynlm के उपयोग की भविष्यवाणी नहीं कर सकते।
14

हम्म, आप कह रहे हैं कि वे जादुई रूप से स्टैकओवरफ़्लो की निगरानी करने और बग्स को ठीक करने नहीं जा रहे हैं? मुझे लगता है कि यह सच है!
ह्यू पेर्किंस

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 )
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.