3

最小二乗法を使用した結果は、私が見ることができる韻や理由なしに変化し、問題を関数自体 splines::nsにたどったと思います。ns

問題を次のように減らしました。

require(splines)
N <- 0
set.seed(1)
for (i in 1:100) N <- N + identical(ns(1:10,3),ns(1:10,3))
N

私の結果は平均で約 39、範囲は 34 ~ 44 程度ですが、毎回 100 を期待していました。の結果nsがランダムである必要があるのはなぜですか? 両方の場所でを代入bsするnsと、予想どおり 100 になります。私set.seed(1)が得たランダム性が R が意図したものではないことを実証したいと思っています。

RStudio と R バージョン 2.14.2 (2012-02-29) を使用したクリーン セッションでは、39、44、38 などを取得します。他の全員は 100 を取得しているようです。

詳細情報:

を代入splines::nsnsても同じ結果になります。クリーンなバニラ セッションでも同じ結果が得られます。私のコンピューターには 8 つのコアがあります。

違いが発生した場合、通常または常に 2^-54 です。

Max <- 0
for (i in 1:1000) Max <- max( Max, abs(ns(1:10,3)-ns(1:10,3)) )
c(Max,2^-54)

結果で[1] 5.551115e-17 5.551115e-17。この変動性は、将来的に大きな問題を引き起こすoptimize(...)$min.

クリーンなバニラ セッションを使用した私の sessionInfo:

を使用して、クリーンなバニラセッションとして知られると私が理解しているものを作成しました

> .Last <- function() system("R --vanilla") 
> q("no")

これによりセッションが吹き飛ばされ、再起動すると、クリーンなバニラ セッションが得られます。次に、Ben Bolker の明確な質問に答えて、クリーンなバニラ セッションの最初にこれを行いました。

> sessionInfo()
R version 2.14.2 (2012-02-29)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Revobase_6.1.0   RevoMods_6.1.0   RevoScaleR_3.1-0 lattice_0.20-0  
[5] rpart_3.1-51    

loaded via a namespace (and not attached):
[1] codetools_0.2-8   foreach_1.4.0     grid_2.14.2       iterators_1.0.6  
[5] pkgXMLBuilder_1.0 revoIpe_1.0       tools_2.14.2      XML_3.9-1.1      
> require(splines)
Loading required package: splines
> N <- 0
> set.seed(1)
> for (i in 1:100) N <- N + identical(ns(1:10,3),ns(1:10,3))
> N
[1] 32
4

1 に答える 1

1

これは、REvolution Technical Supportから得た回答です(許可を得てここに投稿):

ここでの問題は、浮動小数点演算の問題です。Revolution R は、一部の計算に Intel mkl BLAS ライブラリを使用します。これは、CRAN-R が使用し、「ns()」計算にこのライブラリを使用するものとは異なります。この場合、Intel プロセッサ ベースのマシンで計算を行っているか、AMD チップセットを搭載したマシンで計算を行っているかによって、異なる結果が得られます。

CRAN-R に同梱されているのと同じ BLAS および Lapack DLL を出荷していますが、これらは Revolution R で使用されるデフォルトのものではありません。顧客は、必要に応じて、以下を実行することにより、インストールされている DLL を元に戻すことができます。

1)。「C:\Revolution\R-Enterprise-6.1\R-2.14.2\bin」フォルダの「Rblas.dll」を「Rblas.dll.bak」に、「Rlapack.dll」を「Rlapack.dll.bak」に名前変更します。 \x64'.

2)。このフォルダー内のファイル 'Rblas.dll.0' および 'Rlapack.dll.0' の名前を、それぞれ Rblas.dll および Rlpack.dll に変更します。

彼らの提案は完璧に機能しました。RStudio (Revolution R を使用) と Revolution R 独自の IDE の両方を使用して、これらのファイルの名前を何度か変更しましたが、常に同じ結果が得られました: BLAS dllN==40 or soではN==100.

私のテストでは、BLAS の場合は 8 倍%*%svd(). そして、それは私のコアの 1 つを使用しているだけです (Windows タスク マネージャーの [プロセス] タブの [CPU 使用率] 列で確認)。

私はまだこれの完全な影響を本当に理解していないので、より理解のある人がより良い答えを書くことができることを願っています.

于 2012-12-18T20:40:27.933 に答える