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()
*/