ComenzarEmpieza gratis

Simular modelo AR(p)

Los modelos autorregresivos (AR) son un tipo de regresión lineal para series temporales en los que los valores predichos dependen de los valores en puntos temporales anteriores. Debido a esta dependencia, el modelo debe calcularse punto a punto en el tiempo. Eso implica usar un bucle for, ¡así que C++ viene de perlas!

Aquí tienes el algoritmo en 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 es el número de observaciones simuladas, c es una constante, phi es un vector numérico de coeficientes de autocorrelación y eps es la desviación estándar del ruido. Completa la definición de ar2(), una traducción a C++ de ar1().

Este ejercicio forma parte del curso

Optimizar código de R con Rcpp

Ver curso

Instrucciones del ejercicio

  • Genera un número aleatorio con distribución normal con media c y desviación estándar eps, usando la API de R de Rcpp.
  • Haz que el bucle for interno itere de 0 a p.
  • Dentro del bucle interno, incrementa value por el elemento j de phi multiplicado por el elemento "i menos j menos 1" de x.

Ejercicio interactivo práctico

Prueba este ejercicio y completa el código de muestra.

#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 y ejecutar código