ns因各种原因而变化

时间:2012-12-14 02:28:37

标签: r

我使用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::ns替换ns会得到相同的结果。干净的香草会话给出了相同的结果。我的电脑有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

1 个答案:

答案 0 :(得分:1)

这是我从REvolution Technical Suppoort获得的答案(经许可发布):

  

这里的问题是浮点运算问题。革命   R使用Intel mkl BLAS库进行一些计算,这些计算有所不同   来自CRAN-R使用的内容并将此库用于'ns()'   计算。在这种情况下,您也会得到不同的结果   取决于你是否正在进行计算   基于Intel处理器的机器或带有AMD芯片组的机器。

     

我们发运的是随附的BLAS和Lapack DLL   CRAN-R,但它们不是Revolution R使用的默认值。   如果客户选择并愿意,客户可以还原已安装的DLL,   通过执行以下操作:

     

1)。将'Rblas.dll'重命名为'Rblas.dll.bak'和'Rlapack.dll'   'Rlapack.dll.bak'        在'C:\ Revolution \ R-Enterprise-6.1 \ R-2.14.2 \ bin \ x64'文件夹中。

     

2)。在此文件夹中重命名文件'Rblas.dll.0'和'Rlapack.dll.0'   分别为Rblas.dll和Rlpack.dll。

他们的建议完美无缺。我使用RStudio(使用Revolution R)和Revolution R自己的IDE来回重命名这些文件几次,总是得到相同的结果:BLAS dll给我N==40 or so,CRAN-R dlls给我N==100

我可能会回到BLAS,因为在我的测试中,%*%的速度提高了8倍,svd()的速度提高了4倍。这只是使用我的一个核心(由Windows任务管理器的进程选项卡的CPU使用情况列验证)。

我希望有更好理解的人可以写出更好的答案,因为我仍然不明白这一点的全部后果。