1. Học hỏi
  2. /
  3. Khoa Học
  4. /
  5. Tối ưu hóa mã R với Rcpp

Connected

Bài tập

Mô phỏng mô hình MA(q)

Các mô hình moving average (MA) cũng phụ thuộc vào vòng lặp trước. Khác với mô hình AR, sự phụ thuộc nằm ở phần nhiễu.

Đây là thuật toán bằng 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 là số lượng quan sát được mô phỏng, mu là kỳ vọng, theta là một vector số của các hệ số moving average, và sd là độ lệch chuẩn của nhiễu.

Trước đó trong chương, bạn đã dùng R::rnorm() để sinh một số duy nhất từ phân phối chuẩn. Cũng có Rcpp::rnorm(), có thể sinh cả một vector số trong một lần gọi. Hàm này nhận cùng các đối số như rnorm() của R. Hoàn thiện phần định nghĩa hàm ma2(), bản dịch C++ của ma1().

Hướng dẫn

100 XP
  • Sinh vector nhiễu và gán vào eps. Dùng rnorm() từ namespace Rcpp (không phải namespace R).
  • Bên trong vòng lặp for phía ngoài, tính value bằng mu cộng với giá trị nhiễu thứ i.
  • Bên trong vòng lặp for phía trong, tăng value thêm phần tử thứ j của theta nhân với phần tử thứ "i trừ j trừ 1" của eps.
  • Sau các vòng lặp, gán phần tử thứ i của x bằng value.