R: Как мне моделировать данные временного ряда в реплике, пока не будут выполнены некоторые условия - PullRequest
0 голосов
/ 01 марта 2020

Я хочу смоделировать данные временного ряда, следующие за AR (1) с phi = 0,6, так что, если я попробую свое первое моделирование, я проверю, следует ли оно за AR (1). Если нет, я сделаю второе испытание, вместе с первым я получу среднее из двух испытаний, чтобы сформировать серию. Я проверяю заказ, пока он не соответствует AR (1), в противном случае я продолжаю добавлять один (1) к своим испытаниям, пока не подтвердил, что среднее значение испытаний представляет собой временной ряд модели AR (1).

После этого я проверю, равен ли коэффициент AR (1) phi = 0,6. если нет, я добавлю еще один (1) к своим испытаниям, пока не проверю, что phi = 0,6.

** MWE *

library(FitAR)
n=50
a=0.6
count=0
e <- rnorm(n+100)
x <- double(n+100)
x[1] <- rnorm(1)
for(i in 2:(n+100)) {
  x[i] <- a * x[i-1] + e[i]
  }
x <- ts(x[-(1:100)])
p=SelectModel(x, lag.max = 14, Criterion = "BIC", Best=1)
if(p >= 2){
  count <- count + 1
  mat <- replicate(count, x)
  x <- as.ts(rowMeans(mat))
}
fit=arima(x,order = c(p,0,0))
my_coef=fit$coef
if(my_coef != 0.6){
  mat <- replicate(count + 1, x)
  x <- as.ts(rowMeans(mat))
}
my_coefficients=my_coef[!names(my_coef) == 'intercept']
print(my_coefficients)
print(paste0("AR(2) model count is: ", count_coef))

1 Ответ

1 голос
/ 11 марта 2020

Мы можем сгенерировать данные временного ряда для 100 временных точек процесса ARIMA (0, 0, 0) белого шума с нулевым средним и стандартным отклонением sd = 2 следующим образом

set.seed(2020)
ts <- arima.sim(model = list(), n = 100, sd = 2)

Это объяснено в документации ?arima.sim

Использование:

arima.sim(model, n, rand.gen = rnorm, innov = rand.gen(n, ...),
           n.start = NA, start.innov = rand.gen(n.start, ...),
           ...)

 ...: additional arguments for ‘rand.gen’.  Most usefully, the
      standard deviation of the innovations generated by ‘rnorm’
      can be specified by ‘sd’.

Для генерации 50 временных рядов мы можем использовать replicate

set.seed(2020)
mat <- replicate(50, arima.sim(model = list(), n = 100, sd = 2))

Полученный объект представляет собой matrix с размерами 100 x 50.


Мы можем подтвердить, что стандартное отклонение действительно sd = 2

summary(apply(mat, 2, sd))
# Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
#1.669   1.899   2.004   2.006   2.107   2.348
library(tidyverse)
apply(mat, 2, sd) %>%
    enframe() %>%
    ggplot(aes(value)) +
    geom_histogram(bins = 10)

enter image description here

...