我使用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
答案 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使用情况列验证)。
我希望有更好理解的人可以写出更好的答案,因为我仍然不明白这一点的全部后果。