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().
Bài tập này là một phần của khóa học
Tối ưu hóa mã R với Rcpp
Hướng dẫn bài tập
- Sinh vector nhiễu và gán vào
eps. Dùngrnorm()từ namespaceRcpp(không phải namespaceR). - Bên trong vòng lặp for phía ngoài, tính
valuebằngmucộng với giá trị nhiễu thứi. - Bên trong vòng lặp for phía trong, tăng
valuethêm phần tử thứjcủathetanhân với phần tử thứ "itrừjtrừ1" củaeps. - Sau các vòng lặp, gán phần tử thứ
icủaxbằngvalue.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
#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()
*/