Mô hình tự hồi quy

Tối ưu hóa mã R với Rcpp

Romain François

Consulting Datactive, ThinkR

Mô hình tự hồi quy, AR

ar <- function(n, phi, sd){
    x  <- epsilon <- rnorm(n, sd = sd)
    np <- length(phi)

    for( i in seq(np+1, n)){
        x[i] <- sum(x[seq(i-1, i-np)] * phi) + epsilon[i]
    }
    x
}
Tối ưu hóa mã R với Rcpp

AR trong C++

  • Bước đầu 🔃, điền np giá trị đầu tiên
NumericVector x(n) ;
// initial loop
for( ___ ; __ < np ; ___ ){
    x[i] = R::rnorm(___) ; }
  • Phần chính với vòng lặp ngoài và trong 🔃
// outer loop
for( ___ ; ___ ; ___ ){    
    double value = rnorm(___) ;    
    // inner loop
    for( ___ ; ___ ; ___ ){
        value += ___ ;    }
    x[i] = value ;
}
Tối ưu hóa mã R với Rcpp

Mô phỏng trung bình trượt

ma <- function(n, theta, sd){
    epsilon <- rnorm(n, sd = sd)
    x <- numeric(n)
    nq <- length(theta)

    for( i in seq(nq+1, n)){
        x[i] <- sum(epsilon[seq(i-1, i-nq)] * theta) + epsilon[i]
    }
    x
}
Tối ưu hóa mã R với Rcpp

Trung bình trượt

#include <Rcpp.h>
using namespace Rcpp ;
// [[Rcpp::export]]
NumericVector ma( int n, double mu, NumericVector theta, double sd ){
    int nq = theta.size() ;

    // tạo vector nhiễu một lần
    // dùng hàm Rcpp::rnorm, tương tự hàm R
    NumericVector eps = Rcpp::rnorm(n, 0.0, sd) ;

    // khởi tạo vector đầu ra kích thước n với toàn 0.0 
    NumericVector x(___) ;

    // bắt đầu điền giá trị tại chỉ số nq + 1
    for( int i=nq+1; i<n; i++){
        ____   }
    return x ;
}
Tối ưu hóa mã R với Rcpp

ARMA(p,q) = AR(p) + MA(q)

Tối ưu hóa mã R với Rcpp

Cùng luyện tập nào!

Tối ưu hóa mã R với Rcpp

Preparing Video For Download...