2017-02-24 2 views
0

Lorsque je prévoyais en utilisant la bibliothèque forecast, j'ai remarqué le code suivant ne fonctionne pas comme prévu:Erreur dans ts (x): l'objet 'ts doit avoir un ou plusieurs observations

library(forecast) 
library(dplyr) 
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100)) 

get <- function (df1){ 
    ts1 <- ts((df1%>%filter(gp==2))$dt) 
    as.numeric(forecast(ar(ts1),15)$mean) 
}  

print(get(df1)) 

Le retour d'erreur est la suivante:

erreur dans ts (x): l'objet 'ts doit avoir un ou plusieurs observations

Peut être qu'elle est causée par ar ou ar.burg fonction. Parce que si vous changez la fonction en ets ou autre chose, la fonction fonctionne bien.

Ce qui est plus étrange est que si vous changez le code:

library(forecast) 
library(dplyr) 
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100)) 
ts1 <- ts((df1%>%filter(gp==2))$dt) 

get <- function (ts1){ 
    as.numeric(forecast(ar(ts1),15)$mean) 
} 


print(get(ts1)) 

Le code est également en cours d'exécution correctement. Je pense que cela peut être un bug dans la fonction ar, et le problème est en quelque sorte lié à la portée. Des pensées à ce sujet?

Répondre

2

Le problème est lié à la portée. forecast() essaie de trouver la série temporelle utilisée pour s'adapter au modèle. Les fonctions du package de prévision (telles que ets) stockent ces informations dans l'objet de modèle, il est donc facile pour forecast() de le trouver. Mais ar() provient du package stats et ne stocke pas les séries temporelles utilisées pour le modèle. Donc, forecast() va le chercher. Si vous exécutez votre code en dehors de la fonction get(), cela fonctionne correctement car forecast() parvient à trouver l'objet ts1 dans l'environnement local. Mais dans la fonction get() cela provoque une erreur.

Une solution simple consiste à ajouter les informations au modèle ajusté avant d'appeler forecast:

library(forecast) 
library(dplyr) 
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100)) 
ts1 <- ts((df1%>%filter(gp==2))$dt) 

get <- function (ts1){ 
    fit <- ar(ts1) 
    fit$x <- ts1 
    as.numeric(forecast(fit,15)$mean) 
} 

print(get(ts1)) 

Vous pouvez également utiliser predict au lieu de forecast:

library(dplyr) 
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100)) 
ts1 <- ts((df1%>%filter(gp==2))$dt) 

get <- function (ts1){ 
    fit <- ar(ts1) 
    as.numeric(predict(fit,n.ahead=15)$pred) 
} 

print(get(ts1))