2015-04-25 2 views
0

У меня есть упражнение делать, где я должен выполнить следующую AR (1) модель:нечисловой аргумент бинарного оператора, AR (1) модель

xi =c+φxi−1+ηi (i=1,...,T) 

Я знаю, что п ~ N (0 , 1); x0 ~ N (c/(1-φ), 1/(1-φ2)); c = 2; φ = 0.6 Я пытаюсь сделать цикл for. Мой код выглядит следующим образом:

n <- rnorm(T, 0, 1) 
c <- 2 
phi <- 0.6 

x_0 <- rnorm(1,c/(1-phi), 1/(1-phi**2)) 

v <- vector("numeric", 0) 

#for (i in 2:T){ 

    name <- paste("x", i, sep="_") 
    v <- c(v,name) 
    v[1] <- c + phi*x_0 + n[1] 
    v[i] <- c + phi*v[i-1] + n[i] 

} 

Однако, я получаю эту ошибку:

Error in phi * v[i - 1] : non-numeric argument to binary operator 

Я понимаю, что эта ошибка, но я не могу найти какие-либо решения для ее решения. Может кто-нибудь, пожалуйста, просветит меня? Как я могу назначить числовые значения вектору имени?

Спасибо!

+0

Вы определяете 'v' как числовой вектор, но затем добавляете к нему' имя', которое является символом, поэтому 'v' становится символом. Вот почему вы получаете сообщение об ошибке выполнения операций над нечисловым значением - 'v' не является числовым. Если вы пытаетесь связать имена с каждым значением 'v', установите' names (v) 'равным списку имен. –

ответ

0

Вы определяете v как числовой вектор, но затем v <- c(v, name) превращает v в вектор символов, поскольку name является характер. Вот что вызывает ошибку.

Если я не ошибаюсь, ваше намерение заключается в присвоении имен значениям в числовом векторе. Все в порядке, вам просто нужен другой подход.

n <- rnorm(t) 
c <- 2 
phi <- 0.6 

x_0 <- rnorm(1, c/(1-phi), 1/(1-phi^2)) 

v <- c + phi*x_0 + n[1] 

for (i in 2:t) { 
    v[i] <- c + phi*v[i-1] + n[i] 
} 

names(v) <- paste("x", 1:t, sep="_") 

Векторы в R не имеют статического размера; они динамически изменяются по мере необходимости. Поэтому, даже если мы инициализируем v со скалярным значением, он растет, чтобы соответствовать каждому новому значению в цикле.

Последний шаг - дать v список имен. Это можно сделать, используя names(v) <-. Взгляните на v сейчас - у него есть имена!

И как в стороне, так как T является синонимом для TRUE в R, лучше не использовать T в качестве имени переменной. Таким образом, я использовал здесь t.

0

Думаю, вам, похоже, нужно следующее. Он будет создавать 11 элементов, включая начальное значение x. Вы можете исключить его позже.

set.seed(1237) 
t <- 10 
n <- rnorm(t, 0, 1) 
c <- 2 
phi <- 0.6 
x0 <- rnorm(1, c/(1-phi), 1/(1-phi**2)) 
v <- c(x0, rep(0, t)) 

for(i in 2:length(v)) { 
    v[i] <- c + phi * v[i-1] + n[i-1] 
} 
v 
[1] 4.967833 4.535847 2.748292 2.792992 5.389548 6.173001 4.526824 3.790483 4.307981 5.442913 4.958193 
Смежные вопросы