시작하기무료로 시작하기

MA(q) 모형 시뮬레이션

이동 평균 (MA) 모형도 이전 반복에 의존합니다. AR 모형과 달리, 잡음 부분에 의존해요.

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은 시뮬레이션할 관측치의 수, mu는 기댓값, theta는 이동 평균 계수의 숫자형 벡터, sd는 잡음의 표준편차입니다.

이 장의 앞부분에서 정규분포에서 단일 난수를 생성하기 위해 R::rnorm()을 사용했어요. 한편 Rcpp::rnorm()은 한 번에 전체 숫자형 벡터를 생성할 수 있습니다. 이는 R의 rnorm()과 동일한 인수를 받아요. ma1()을 C++로 옮긴 ma2() 함수 정의를 완성하세요.

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

Rcpp로 R 코드 최적화하기

강의 보기

연습 안내

  • 잡음 벡터를 eps로 생성하세요. Rcpp 네임스페이스의 rnorm()을 사용하세요(‘R 네임스페이스’가 아닙니다).
  • 바깥 for 루프 안에서 valuemui번째 잡음 값을 더한 것으로 계산하세요.
  • 안쪽 for 루프 안에서 valuethetaj번째 원소와 eps의 “i에서 j를 빼고 다시 1을 뺀” 원소를 곱한 값을 더하세요.
  • 루프가 끝나면 xi번째 원소를 value로 설정하세요.

실습형 인터랙티브 연습

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

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