Comece agoraComece grátis

Simular modelo AR(p)

Modelos autorregressivos (AR) são um tipo de regressão linear para séries temporais em que os valores previstos dependem dos valores em pontos de tempo anteriores. Devido a essa dependência, o modelo precisa ser calculado ponto a ponto, em sequência. Isso pede um loop for — e é aí que C++ ajuda muito!

Aqui está o algoritmo em R:

ar1 <- function(n, constant, phi, eps) {
  p <- length(phi)
  x <- numeric(n)
  for(i in seq(p + 1, n)) {
    value <- rnorm(1, constant, eps)
    for(j in seq_len(p)) {
      value <- value + phi[j] * x[i - j]
    }
    x[i] <- value
  }
  x
}

n é o número de observações simuladas, c é uma constante, phi é um vetor numérico de coeficientes de autocorrelação e eps é o desvio padrão do ruído. Complete a definição de ar2(), uma tradução em C++ de ar1().

Este exercicio faz parte do curso

Otimizando código R com Rcpp

Ver curso

Instruções do exercicio

  • Gere um número aleatório com distribuição normal, média c e desvio padrão eps, usando a API do R do Rcpp.
  • Faça o loop for interno iterar de 0 até p.
  • Dentro do loop interno, aumente value pelo elemento j de phi vezes o elemento de x na posição "i menos j menos 1".

exercicio interativo prático

Tente este exercicio completando este código de exemplo.

#include 
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector ar2(int n, double c, NumericVector phi, double eps) {
  int p = phi.size();  
  NumericVector x(n);
  
  // Loop from p to n
  for(int i = p; i < n; i++) {
    // Generate a random number from the normal distribution
    double value = ___::___(___, ___);
    // Loop from zero to p
    for(int j = ___; j < ___; j++) {
      // Increase by the jth element of phi times 
      // the "i minus j minus 1"th element of x
      value += ___[___] * ___[___];
    }
    x[i] = value;
  }
  return x;
}

/*** R
d <- data.frame(
  x = 1:50,
  y = ar2(50, 10, c(1, -0.5), 1)
)
ggplot(d, aes(x, y)) + geom_line()
*/
Editar e Executar Código