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是随机的?如果我在两个地方都替换bsns我得到 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(...)$minnow 有时甚至在第一个数字中也会发生变化,导致结果不可重复。

我的 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 Suppoort 得到的答案(经许可在此处发布):

这里的问题是浮点运算的问题。Revolution R 使用英特尔 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 dll 给我N==40 or so,CRAN-R dll 给我N==100

我可能会回到 BLAS,因为在我的测试中,它%*%svd(). 这只是使用我的一个内核(由 Windows 任务管理器的进程选项卡的 CPU 使用率列验证)。

我希望有更好理解的人能写出更好的答案,因为我仍然不太了解这一切的全部后果。

于 2012-12-18T20:40:27.933 回答