Simular modelo MA(q)
Modelos de média móvel (MA) também dependem da iteração anterior. Diferente dos modelos AR, a dependência está na parte do ruído.
Aqui está o algoritmo em R:
ma1 <- function(n, mu, theta, sd) {
q <- length(theta)
x <- numeric(n)
eps <- rnorm(n, 0, sd)
for(i in seq(q + 1, n)) {
value <- mu + eps[i]
for(j in seq_len(q)) {
value <- value + theta[j] * eps[i - j]
}
x[i] <- value
}
x
}
n é o número de observações simuladas, mu é o valor esperado, theta é um vetor numérico de coeficientes de média móvel e sd é o desvio-padrão do ruído.
No início do capítulo, você usou R::rnorm() para gerar um único número de uma distribuição normal. Também existe Rcpp::rnorm(), que pode gerar de uma vez um vetor numérico inteiro. Ela recebe os mesmos argumentos que a rnorm() do R.
Complete a definição da função ma2(), uma tradução em C++ de ma1().
Este exercicio faz parte do curso
Otimizando código R com Rcpp
Instruções do exercicio
- Gere o vetor de ruído como
eps. Usernorm()do namespaceRcpp(não do namespaceR). - Dentro do loop externo, calcule
valuecomomumais o i-ésimo valor de ruído. - Dentro do loop interno, aumente
valuepelo j-ésimo elemento dethetavezes o elemento "i menos j menos 1" deeps. - Após os loops, defina o i-ésimo elemento de
xcomovalue.
exercicio interativo prático
Tente este exercicio completando este código de exemplo.
#include
using namespace Rcpp ;
// [[Rcpp::export]]
NumericVector ma2( int n, double mu, NumericVector theta, double sd ){
int q = theta.size();
NumericVector x(n);
// Generate the noise vector
NumericVector eps = ___(___, 0.0, ___);
// Loop from q to n
for(int i = q; i < n; i++) {
// Value is mean plus noise
double value = ___ + ___;
// Loop from zero to q
for(int j = 0; j < q; j++) {
// Increase by the jth element of theta times
// the "i minus j minus 1"th element of eps
value += ___ * ___;
}
// Set ith element of x to value
___ = ___;
}
return x ;
}
/*** R
d <- data.frame(
x = 1:50,
y = ma2(50, 10, c(1, -0.5), 1)
)
ggplot(d, aes(x, y)) + geom_line()
*/