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 루프 안에서
value를mu에i번째 잡음 값을 더한 것으로 계산하세요. - 안쪽 for 루프 안에서
value에theta의j번째 원소와eps의 “i에서j를 빼고 다시1을 뺀” 원소를 곱한 값을 더하세요. - 루프가 끝나면
x의i번째 원소를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()
*/