Otokorelasyon modeli

Rcpp ile R Kodunu Optimize Etme

Romain François

Consulting Datactive, ThinkR

Otokorelasyon modeli, 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
}
Rcpp ile R Kodunu Optimize Etme

C++ ile AR

  • İlk 🔃, np ilk değeri doldurmak için
NumericVector x(n) ;
// initial loop
for( ___ ; __ < np ; ___ ){
    x[i] = R::rnorm(___) ; }
  • Dış ve iç 🔃 ile ana kısım
// outer loop
for( ___ ; ___ ; ___ ){    
    double value = rnorm(___) ;    
    // inner loop
    for( ___ ; ___ ; ___ ){
        value += ___ ;    }
    x[i] = value ;
}
Rcpp ile R Kodunu Optimize Etme

Hareketli ortalama benzetimi

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
}
Rcpp ile R Kodunu Optimize Etme

Hareketli ortalama

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

    // gürültü vektörünü tek seferde üret
    // R fonksiyonuna benzer Rcpp::rnorm fonksiyonunu kullan
    NumericVector eps = Rcpp::rnorm(n, 0.0, sd) ;

    // boyutu n olan çıktı vektörünü 0.0 ile başlat
    NumericVector x(___) ;

    // değerleri nq + 1 indeksinden itibaren doldurmaya başla
    for( int i=nq+1; i<n; i++){
        ____   }
    return x ;
}
Rcpp ile R Kodunu Optimize Etme

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

Rcpp ile R Kodunu Optimize Etme

Hadi pratik yapalım!

Rcpp ile R Kodunu Optimize Etme

Preparing Video For Download...