시작하기무료로 시작하기

AR(p) 모형 시뮬레이션

자기회귀 (AR) 모형은 시계열에 대한 선형 회귀의 한 종류로, 예측값이 이전 시점의 값에 의존합니다. 이전 시점에 대한 의존성이 있기 때문에, 이 모형은 시점을 하나씩 순차적으로 계산해야 합니다. 즉, for 반복문을 사용해야 하고, 이런 경우 C++가 큰 도움이 됩니다!

다음은 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은 시뮬레이션할 관측치의 개수, c는 상수, phi는 자기상관 계수의 숫자형 벡터, eps는 잡음의 표준편차입니다. ar1()을 C++로 옮긴 ar2()의 정의를 완성해 보세요.

이 연습은 강의의 일부입니다

Rcpp로 R 코드 최적화하기

강의 보기

연습 안내

  • Rcpp의 R API를 사용해 평균이 c, 표준편차가 eps인 정규분포 난수를 생성하세요.
  • 내부 for 반복문이 0부터 p까지 순회하도록 만드세요.
  • 내부 반복문 안에서 phij번째 원소와 x의 "i에서 j를 빼고 다시 1을 뺀" 번째 원소의 곱만큼 value를 증가시키세요.

실습형 인터랙티브 연습

이 예제를 이 샘플 코드를 완성하여 풀어보세요.

#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()
*/
코드 편집 및 실행