Использование R для удаления строк - PullRequest
0 голосов
/ 07 декабря 2018

R кодов:

  library(forecast)
  library(FitAR)
  set.seed(54321)
  c<-0 # Counter for correct model under method
  n=50
  nsim=10
  phi=c(0.5,-0.2)
  t=1:n
  t.square=t^2
  beta1=2
  beta2=3
  beta3=4
  for (i in 1: nsim) {
  error<-arima.sim(model=list(ar=phi),n=n,innov=rnorm(n,0,1))
  yt=beta1+beta2*t+beta3*t.square+error
  dt=cbind(t,t.square)
  p<- SelectModel(as.ts(error), lag.max = 15, Criterion = "BIC", Best=1)
  f1=Arima(yt, xreg=dt, order=c(p,0,0),include.drift=FALSE, include.constant 
  = FALSE, method =  "ML")
  print((coef(f1)))
   }

Вывод:

       ar1        ar2        ar3          t   t.square 
    0.9031324 -0.4968706  0.4069485  3.1808610  3.9965791 
       ar1         t     t.square 
     0.7372397 3.1051317 3.9989081 
                    t    t.square 
               3.178753 3.996895 
        ar1         t     t.square 
     0.6279603 3.1813097 3.9967204 
        ar1         t     t.square 
     0.5789377 3.1561776 3.9976448 
      ar1        ar2          t     t.square 
     0.8023629 -0.2414305  3.1717066  3.9968250 
      ar1        ar2          t   t.square 
     0.8423128 -0.3565319  3.1768333  3.9966517 
     ar1         t     t.square 
     0.5170698 3.0990545 3.9987464 
     ar1         t        t.square 
     0.5521029 3.1356383 3.9978553 
     ar1         t        t.square 
    0.5280407 3.1679048 3.9972218 

Количество симуляций равно 10. Приведенный выше вывод является оценкой для AR порядка 2 и с переменными tи t.square.

Я хочу получить коды только тогда, когда у нас есть два коэффициента для AR (2).Это означает, что для каждой симуляции, если ar1 и ar2 существуют, сохраните строку, если не удалите ее.

Так что я хотел бы получить

      ar1        ar2          t     t.square 
     0.8023629 -0.2414305  3.1717066  3.9968250 
      ar1        ar2          t   t.square 
     0.8423128 -0.3565319  3.1768333  3.9966517 

Заранее спасибо.

1 Ответ

0 голосов
/ 08 декабря 2018

Я думаю, это поможет.Во-первых, вы можете использовать цикл while над i, чтобы увеличивать счетчик только тогда, когда вы получите желаемый результат (AR (2)).Затем вы можете определить условие, что имена вектора коэффициентов содержат ar2, а не ar3.Тогда вы сохраняете смоделированные значения только в тех случаях.

library(forecast)
library(FitAR)
set.seed(54321)
c<-0 # Counter for correct model under method
n=50
nsim=10
phi=c(0.5,-0.2)
t=1:n
t.square=t^2
beta1=2
beta2=3
beta3=4
out <- array(dim=c(nsim, 4))
colnames(out) <- c("ar1", "ar2", "t", "t.square")
i <- 1
while(i <= nsim){
    error<-arima.sim(model=list(ar=phi),n=n,innov=rnorm(n,0,1))
    yt=beta1+beta2*t+beta3*t.square+error
    dt=cbind(t,t.square)
    p<- SelectModel(as.ts(error), lag.max = 15, Criterion = "BIC", Best=1)
    f1=Arima(yt, xreg=dt, order=c(p,0,0),include.drift=FALSE, include.constant 
        = FALSE, method =  "ML")
    co <- coef(f1)
    insim <- ("ar2" %in% names(co)) & !("ar3" %in% names(co))
    if(insim){
        out[i, ] <- co
        i <- i+1
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...