Jag försöker simulera en ARMA (1,1) -process vars autoregressiva och glidande medelparametrar är respektive 0,74 och 0,47. Dessutom vill jag att de simulerade uppgifterna ska ha medelvärdet 900 och standardavvikelsen lika med 230. För att uppnå detta försökte jag
set.seed(100) fit = arima.sim(list(order = c(1,0,1), ar = 0.74, ma = 0.47), n = 10000, rand.gen= rnorm, sd = 230) + 900
Medlet för den syntetiska tidsserien är acceptabelt.
mean(fit) #922.749
Men när jag beräknar standardavvikelsen är skillnaden mellan beräknat värde och det jag föreskrev som standardavvikelsen för fit
är för stor.
sd(fit) #511.3077 - almost two times higher than the value I thought I"d observe
Hur kan jag ändra min kod för att se till att den simulerade serien har en standardavvikelse nära den som jag anger i
arima.sim
-funktionen?
Svar
sd(fit)
är $ \ sqrt {Var (y_t)} $ där $ y_t $ är ARIMA (1,1), men sd
du anger i arima.sim
samtalet är sd
av det vita bruset i serien.
Tänk på AR (1) -processerna $$ y_t = b y_ {t-1} + u_t $$ $$ u_t = \ sigma \ epsilon_t $$ $$ \ epsilon_t \ sim \ mathcal N (0,1) $$ här $ sd (y_t) = \ sqrt {Var (y_t)} $ vilket kan konstateras vara $$ Var (y_t ) = b ^ 2Var (y_ {t-1}) + \ sigma ^ 2Var (\ epsilon_t) $$ så att
$$ Var (y_t) = \ frac {\ sigma ^ 2} {1-b ^ 2} $$
och $ \ sigma $ är standardavvikelsen för $ u_t $ .
Ange en modell i R
set.seed(100) b <- 0.5 s <- 0.9 fit = arima.sim(list(order = c(1,0,0), ar = b), n = 100000, rand.gen= rnorm, sd = s) sd(fit) sqrt(s^2/(1-b^2))
returnerar utdata
> sd(fit) [1] 1.041033 > sqrt(s^2/(1-b^2)) [1] 1.03923
så att sd
i arima.sim
är $ \ sigma $ .