始める無料で始める

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()
*/
コードを編集して実行