增加观测值的数量有 R 抛出随机系数 - 数值稳定性问题?

Increasing the number of observations have R throw random coefficients - Numerical stability problem?

提问人:robertspierre 提问时间:5/25/2019 最后编辑:robertspierre 更新时间:9/30/2022 访问量:130

问:

我有这个代码

rm(list=ls())
N = 20000
xvar <- runif(N, -10, 10) 
e <- rnorm(N, mean=0, sd=1)
yvar <- 1 + 2*xvar + e
plot(xvar,yvar)
lmMod <- lm(yvar~xvar)
print(summary(lmMod))

我预计系数类似于 [1,2]。

取而代之的是,R 不断向我抛出没有统计学意义且不适合模型的随机数,$R^2$ 真的很低。我只是看不出我做错了什么。下面是一个示例输出:N =20000

Call:
lm(formula = yvar ~ xvar)

Residuals:
   Min     1Q Median     3Q    Max 
-47.23  -9.10   1.24  11.23  23.74 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)  0.03163    0.08291   0.381  0.70286   
xvar         0.04290    0.01427   3.006  0.00265 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11.73 on 19998 degrees of freedom
Multiple R-squared:  0.0009635, Adjusted R-squared:  0.0009135 
F-statistic: 19.29 on 1 and 19998 DF,  p-value: 1.131e-05

但是,如果我输入 N=200 或 N=2000,它就可以工作。系数与实数相似,在实数的两个标准差内,我得到的 $R^2$ 值高达 99%,并且系数在统计学上都是显著的,为 $p<<0.01$。

这是怎么回事?为什么增加观测值的数量会使回归恶化?R 是否暗中遇到数值稳定性问题?

我在 Kubuntu 19.04 上运行 R 3.6.0。使用 --vanilla 选项在命令行上运行 R 也会出现同样的问题。

编辑:这是输出sessioninfo()

> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 19.04

Matrix products: default
BLAS/LAPACK: /usr/lib/x86_64-linux-gnu/libmkl_rt.so

Random number generation:
 RNG:     Mersenne-Twister 
 Normal:  Inversion 
 Sample:  Rounding 

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=it_IT.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=it_IT.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=it_IT.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=it_IT.UTF-8 LC_IDENTIFICATION=C       

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

loaded via a namespace (and not attached):
[1] compiler_3.6.0 tools_3.6.0
r 线性回归 浮点精度 数值稳定性

评论

0赞 Julius Vainora 5/25/2019
按我预期工作。尝试在干净的会话上运行代码,尽管我认为只需重新运行所有代码就足够了。
0赞 robertspierre 5/25/2019
@JuliusVainora我尝试过一个干净的会话,带有 --vanilla 选项的命令行,什么都没有。我不知道这是怎么回事
0赞 Julius Vainora 5/25/2019
请同时包括 的输出。数字问题很难相信,因为 20000 年并不多。sessionInfo()
0赞 robertspierre 5/25/2019
@JuliusVainora完成
1赞 robertspierre 5/25/2019
@JuliusVainora是的,这要归功于英特尔 MKL。卸载英特尔 MKL 并使用 OpenBLAS 反而解决了该问题。这太不可思议了,不是吗?(附言当我看到您建议的 sessioninfo() 的输出时,我有了这个想法。谢谢!

答:

1赞 robertspierre 5/25/2019 #1

这要归功于英特尔 MKL。卸载英特尔 MKL 并使用 OpenBLAS 反而解决了该问题。

评论

0赞 AlefSin 2/5/2020
您是否找到了解决 MKL 问题的解决方案?使用 Ubuntu 19.10 和 R 3.6.1,我得到与您在此处报告的完全相同的行为。
0赞 robertspierre 2/5/2020
@AlefSin,不幸的是没有。我想将其报告为错误,但英特尔的错误报告系统搞砸了
1赞 robertspierre 9/30/2022 #2

正如我之前的回答中所指出的,这是由于使用英特尔的 MKL 作为 BLAS 后端。

但是,它似乎已通过当前的英特尔 MKL 修复,如以下代码所示:

library(flexiblas)

mkl <- "$HOME/intel/oneapi/mkl/latest/lib/intel64/libmkl_rt.so"
idx <- flexiblas_load_backend(mkl)
flexiblas_switch(idx)
sessionInfo()
print(flexiblas_current_backend())

rm(list=ls())
N = 100000
xvar <- runif(N, -10, 10) 
e <- rnorm(N, mean=0, sd=1)
yvar <- 1 + 2*xvar + e
plot(xvar,yvar)
lmMod <- lm(yvar~xvar)
print(summary(lmMod))

返回正确的系数。

评论

0赞 Ben Bolker 9/30/2022
Смотритетакже: community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/...
0赞 robertspierre 9/30/2022
@BenBolker哦,很高兴知道根本原因。谢谢!