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)

그리고 다음은 작동하는 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의 "Applied Multivariate Statistical Analysis"와 같은 다변량 회귀 분석에 대해 읽어보십시오. 또는 예측 과정 : duke.edu/~rnau/411home.htm
deps_stats

1
@deps_stats 종속 변수는 내가 예측하고 싶은 것입니다. 나는 이미 독립 변수에 대한 예측을 가지고 있다고 가정합니다. 예제 코드에서 y는 예측하려는 종속 변수이고 A, B, C는 이미 예측 한 독립 변수입니다. 내가 게시 한 예제 코드를 실행하면 내 문제의 본질을 이해할 수 있습니다.
Zach

@Zach : Nice 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)?
휴 퍼킨스

1
그렇다면이 솔루션은 작동하지 않습니다. 자신 만의 예측 함수를 작성해야합니다.
mpiktas

아, 내가 사실 - P에 무슨 짓을했는지
휴 퍼킨스

1
dynlm 제작자에게 제출을 고려 했습니까? dynlm을 사용하여 예측할 수없는 것은 기괴한 상황입니다.
mpiktas

흠, 당신은 그들이 마술처럼 스택 오버 플로우를 모니터링하고 버그를 수정하지 않을 것이라고 말하고 있습니까? 아마 그럴 것 같아요!
휴 퍼킨스

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.