2017-05-31 6 views
0

J'utilise statsmodels.tsa.arima_model.ARIMA, et j'ai pris la racine carrée de la variable endogène avant de la brancher dans l'algorithme. Le modèle utilise un ordre de 1 differentiation:Comment annuler la différenciation (ordre de décalage 1) d'une variable transformée racine carrée? [ARIMA()]

model = ARIMA(sj_sqrt, order=(2, 1, 0)) 

Après le montage du modèle et saisir les prédictions, je veux mettre les prédictions de retour sous la forme originale de comparaison avec les données d'origine. Cependant, je n'arrive pas à les transformer correctement.

Pour répliquer une version simple de ce problème, voici un code:

#original data: 
test = pd.Series([1,1,1,50,1,1,1,1,1,1,1,1,40,1,1,2,1,1,1,1,1]) 

#sqrt transformed data: 
test_sqrt = np.sqrt(test) 

#sqrt differenced data: 
test_sqrt_diff = test_sqrt.diff(periods=1) 

#undo differencing: 
test_sqrt_2 = cumsum(test_sqrt_diff) 

#undo transformations: 
test_2 = test_sqrt_2 ** 2 

f, axarr = plt.subplots(5, sharex=True, sharey=True) 
axarr[0].set_title('original data:') 
axarr[0].plot(test) 
axarr[1].set_title('sqrt transformed data:') 
axarr[1].plot(test_sqrt) 
axarr[2].set_title('sqrt differenced data:') 
axarr[2].plot(test_sqrt_diff) 
axarr[3].set_title('differencing undone with .cumsum():') 
axarr[3].plot(test_sqrt_2) 
axarr[4].set_title('transformation undone by squaring:') 
axarr[4].plot(test_2) 
f.set_size_inches(5, 12) 

Vous pouvez voir des graphiques que les données non différenciées, est non transformée pas tout à fait sur la même échelle. test[3] retours 50 et test_2[3] retours 36.857864376269056enter image description here

Répondre

0

Solution:

## original 
x = np.array([1,1,1,50,1,1,1,1,1,1,1,1,40,1,1,2,1,1,1,1,1]) 

## sqrt 
x_sq = np.sqrt(x) 

## diff 
d_sq = np.diff(x_sq,n=1) 

## Only works when d = 1 
def diffinv(d,i): 
    inv = np.insert(d,0,i) 
    inv = np.cumsum(inv) 
    return inv 

## inv diff 
y_sq = diffinv(d_sq,x_sq[0]) 

## Check inv diff 
(y_sq==x_sq).all()