2016-04-05 11 views
0

私はRでstats :: Holt-Wintersに基づく新しいロバストHoltWinters関数を作成しました( "Robust Forecasting with Exponential and Holt -Winters Smoothing "Sarah Gelper1、Roland Fried、Christophe Croux。September 26、2008.)なぜですか?まあ...どうして!しかし、私はRはコンパイルされたロードされたCコードを参照しません/見つけられません

統計のコア...脱線::ホルト・冬は方法は、私は(下記参照)

#include <stdlib.h> 
#include <string.h> // memcpy 
#include <math.h> 

#include <R.h> 
#include "ts.h" 

void HoltWinters (
      double *x, /*as.double(x) */ 
      double *x_adj, /*Adjust time series data, if need be     Added*/ 
      int *xl, /*lenx - Length of the current time series*/ 
      double *alpha, /*as.double(max(min(alpha, 1), 0)), */ 
      double *beta, /*as.double(max(min(beta,1), 0)), */ 
      double *gamma, /*as.double(max(min(gamma, 1), 0)), */ 
      double *llamda,/*as.double(max(min(llamda,1),0)),      ADDED*/ 
      int *start_time, /*as.integer(start.time), */ 
      int *seasonal, /*as.integer(!+(seasonal == "multiplicative")), */ 
      int *period, /* as.integer(f), */ 
      int *dotrend, /* as.integer(!is.logical(beta) || beta), */ 
      int *doseasonal, /* as.integer(!is.logical(gamma) || gamma), */ 

      double *a, /*l.start - starting values for level*/ 
      double *b, /*b.start - starting values for Trend*/ 
      double *s, /*s.start - starting values for SEasonal*/ 
      double *l, /*t.start - starting values for LLamda      ADDED*/ 
      double *k, /* Value for K            ADDED*/ 
      double *ck, /*value for ck            ADDED*/ 
      /* return values */ 
      double *SSE, 
      double *level, 
      double *trend, 
      double *season 

    ) 

{ 
    double res = 0, xhat = 0, stmp = 0, theta = 1, RhoK = 0, phi = 0 ; 
    int i, i0, s0; /*i is the current t, i0 is the current LESS starting period, and s0 = is the seasonal current LESS Starting period*/ 

    /* copy start values to the beginning of the vectors */ 
    level[0] = *a; 
    if (*dotrend == 1) trend[0] = *b; 
    if (*doseasonal == 1) memcpy(season, s, *period * sizeof(double)); 

    for (i = *start_time - 1; i < *xl; i++) { 
    /* indices for period i */ 
    i0 = i - *start_time + 2; 
    s0 = i0 + *period - 1; 

    /* forecast *for* period i */ 
    xhat = level[i0 - 1] + (*dotrend == 1 ? trend[i0 - 1] : 0); 

    stmp = *doseasonal == 1 ? season[s0 - *period] : (*seasonal != 1); 


    if (*seasonal == 1) 
     xhat += stmp; 
    else 
     xhat *= stmp; 

    /* Sum of Squared Errors */ 
    res = x[i] - xhat; 

    /*adjusting for robustness....Gahds*/ 
    RhoK = (abs(res/theta) <= *k ? *ck * (1 - pow(1 - pow((res/(*k * theta)),2),3)): *ck); 
    theta = sqrt(*llamda * RhoK * pow(theta,2) + (1 - *llamda) * pow(theta,2)); 
    phi = (abs(res/theta) < *k ? res/theta : ((res/theta)/abs(res/theta) * (*k))); 
    x_adj[i] = phi * theta + xhat; 

    res = x_adj[i] - xhat; 

    *SSE += res * res; 

    /* estimate of level *in* period i */ 
    if (*seasonal == 1) 
     level[i0] = *alpha  * (x_adj[i] - stmp) 
       + (1 - *alpha) * (level[i0 - 1] + trend[i0 - 1]); 
    else 
     level[i0] = *alpha  * (x_adj[i]/stmp) 
       + (1 - *alpha) * (level[i0 - 1] + trend[i0 - 1]); 

    /* estimate of trend *in* period i */ 
    if (*dotrend == 1) 
     trend[i0] = *beta  * (level[i0] - level[i0 - 1]) 
       + (1 - *beta) * trend[i0 - 1]; 

    /* estimate of seasonal component *in* period i */ 
    if (*doseasonal == 1) { 
     if (*seasonal == 1) 
     season[s0] = *gamma  * (x_adj[i] - level[i0]) 
       + (1 - *gamma) * stmp; 
     else 
     season[s0] = *gamma  * (x_adj[i]/level[i0]) 
       + (1 - *gamma) * stmp; 
    } 
    } 
} 

だから私はコンパイル堅牢に変更したC_HoltWintersと呼ばれるCのコードであり、それは、窓にRと、(3.2.2)ため息:

R CMD SHLIB C_R_HoltWinters.c 
gcc -m64 -I"C:/PROGRA~1/R/R-32~1.2/include" -DNDEBUG  -I"d:/RCompile/r-compiling/local/local320/include"  -O2 -Wall -std=gnu99 -mtune=core2 -c C_R_HoltWinters.c -o C_R_HoltWinters.o 
gcc -m64 -shared -s -static-libgcc -o C_R_HoltWinters.dll tmp.def C_R_HoltWinters.o -Ld:/RCompile/r-compiling/local/local320/lib/x64 -Ld:/RCompile/r-compiling/local/local320/lib -LC:/PROGRA~1/R/R-32~1.2/bin/x64 -lR 

読み込み、それをRに:

dyn.load('C_R_HoltWinters.dll') 
それはそこに

> getLoadedDLLs() 
                        Filename Dynamic.Lookup 
base                      base   FALSE 
utils       C:/Program Files/RRO/R-3.2.2/library/utils/libs/x64/utils.dll   FALSE 
methods      C:/Program Files/RRO/R-3.2.2/library/methods/libs/x64/methods.dll   FALSE 
RevoUtilsMath C:/Program Files/RRO/R-3.2.2/library/RevoUtilsMath/libs/x64/RevoUtilsMath.dll   TRUE 
grDevices    C:/Program Files/RRO/R-3.2.2/library/grDevices/libs/x64/grDevices.dll   FALSE 
graphics     C:/Program Files/RRO/R-3.2.2/library/graphics/libs/x64/graphics.dll   FALSE 
stats       C:/Program Files/RRO/R-3.2.2/library/stats/libs/x64/stats.dll   FALSE 
tools       C:/Program Files/RRO/R-3.2.2/library/tools/libs/x64/tools.dll   FALSE 
internet         C:/PROGRA~1/RRO/R-32~1.2/modules/x64/internet.dll   TRUE 
(embedding)                  (embedding)   FALSE 
C_R_HoltWinters            C:/scripts/R/C_R_HoltWinters.dll   TRUE 

ああだかどうかを確認するためにチェック

、うん、そこにそれがあります。それでは、糞と笑うために、私はそれでテストを実行します。

> is.loaded('C_R_HoltWinters') 
[1] FALSE 
> is.loaded("C_R_HoltWinters") 
[1] FALSE 
> is.loaded(C_R_HoltWinters) 
Error in is.loaded(C_R_HoltWinters) : object 'C_R_HoltWinters' not found 

オーケー....それがあるはずですが、そうではありません。多分それは私が、私はそれを実行しようとしない何かを知っている:

> .C("C_R_HoltWinters", blahblahblah) 
    Error in .C("C_R_HoltWinters") : 
     C symbol name "C_R_HoltWinters" not in load table 
> .Call("C_R_HoltWinters", blahblahblah) 
    Error in .Call("C_R_HoltWinters") : 
     C symbol name "C_R_HoltWinters" not in load table 

をしかし、私はfooという別のCコードをロードし、それを実行すると、それが正常に動作します。

RがC_R_HoltWinters.dllを参照できないのはなぜですか?私はそれをパッケージに入れてもこれも壊れますか?

おかげ

+0

何もない、うまく実行しました –

+0

これは本当に奇妙です。あなたの 'getLoadedDLLs()'の出力でこのHoltWintersを見つけることができますか?もう1つの注意点として、このコードをパッケージで使用することを考えているなら、外部呼び出しがR. – andrechalom

+0

Hmにある混乱を容易にナビゲートできるように、Rcppを見ることを強くお勧めします。ここであなたのCコードをコンパイルして、 '#include" ts.h "'行を削除しました。 'dyn.loads'は' getLoadedDLLs() 'に表示されますが、' is.loaded'をチェックするとFALSEを返します。奇妙な。 – andrechalom

答えて

0

OK、ここでの問題は、シンボル名(Cの関数を表すことがある)と共有ライブラリとの間の混乱です。 dyn.load('C_R_HoltWinters.dll')を実行した後、ロードされたことを確認するには、getLoadedDlls()を参照してください。今、is.loadedが探しているのは、このDLLの内部で定義されているシンボルです。だから、次のコードは、Cコードで定義された関数「HoltWinters」は、Rから呼び出すことが可能であることを示します。

> is.loaded("HoltWinters") 
[1] TRUE 

をそして、これはあなたが.Cコールに使用すべき関数名です同じように。

+0

を見つけることができないという結果に変更はすべての私の共有ライブラリは、ライブラリ自体と同じ名前の関数が含まれているという事実ではありません。私の質問を投稿する際うん、私が台無しにした、P – andrechalom

+0

Andrechalom、しかし、私は( 'C_R_HoltsWinter')is.loadedしようとすると、まだ偽..... >> is.loaded( 'C_R_HoltWinters')は述べてい [1] FALSE –

+0

はい、それは実際には正常な動作です。 "C_R_HoltWinter"はライブラリの名前であるためです。 'is.loaded'に渡すべき関数の名前は単に" HoltWinters "です。あなたのCコードをチェックしてください: 'void HoltWinters(' etcなど)。 "is.loaded"は、*ライブラリ*がロードされているかどうかをチェックしません。*関数*がロードされているかどうかを確認します); – andrechalom

関連する問題