【问题标题】:lm()-function gives different results on SolusOS Linux than on Windowslm()-function 在 SolusOS Linux 上的结果与在 Windows 上的结果不同
【发布时间】:2019-11-26 20:52:29
【问题描述】:

我运行 SolusOS 一个 Linux 发行版(4.0,R 3.6.1)和 Windows(Windows 10,R 3.5.2)。

我的代码:

library(datasets)
fit2 <- lm(Sepal.Length~Sepal.Width+Species, data=iris)
summary(fit2)

在 Windows 上:

                   Estimate Std. Error   t value     Pr(>|t|)
(Intercept)       2.2513932  0.3697543  6.088890 9.568102e-09
Sepal.Width       0.8035609  0.1063390  7.556598 4.187340e-12
Speciesversicolor 1.4587431  0.1121079 13.011954 3.478232e-26
Speciesvirginica  1.9468166  0.1000150 19.465255 2.094475e-42

在 SolusOS Linux 上

                    Estimate Std. Error    t value     Pr(>|t|)
(Intercept)       -1.1562296  2.5541337 -0.4526895 6.514443e-01
Sepal.Width       -0.3158123  0.5572782 -0.5667049 5.717849e-01
Speciesversicolor 11.5719475  1.7693108  6.5403701 9.670731e-10
Speciesvirginica  11.6048354  1.7750914  6.5375987 9.810282e-10

AFAIK 在 Windows 上的结果是正确的。 查了资料,一模一样;如果 lm()-function 中的默认值发生更改,请检查文档,但未找到。 .Machine(如某处提到的)有一个区别: $sizeof.long = 8(Linux) vs. 4(Windows) - 我认为这无关紧要。 谷歌搜索了一个小时,但找不到与此相关的任何内容。

有什么想法吗?

编辑:我在两者上都使用 Rstudio,Linux 版本是 99.9.9(奇数;虽然软件中心提供 1.2.1335;Windows 1.2.5001)所以我在 R 终端中运行代码,结果仍然相同。

【问题讨论】:

  • 你能验证他们都为summary(iris)返回相同的结果吗?
  • ... 并确保 fitfit2 没有混淆
  • 摘要(虹膜)是相同的。我使用传输到 Linux 的 Windows iris-data 以及 R 脚本进行了测试。其他一些数据(datasets::USarrests)在 Linux 上也给出了错误的结果。
  • 当你在 linux 机器上启动 R 时,是否还有其他对象被加载;你能在 R 重启时运行ls()
  • 这一定是某种命名冲突。事实上,Windows 结果是正确的。你能绝对确定(1)你从一个新的R终端开始,(2)你的全局环境中没有变量/对象,例如正在加载 .Rprofile,并且 (3) 您不会恢复之前的 R 会话。

标签: r


【解决方案1】:

我今天在 SolusOS 论坛上发帖并被指向 this thread。同样的问题也可能会影响 aov 功能,并且可能与操作系统相关(有人报告说 Ubuntu 也有问题)。

无论如何,感谢您的帮助和努力! (如果可用,我会发布解决方案)

20 年 1 月 8 日更新

(从我的 dev.getsol.us 论坛帖子中复制粘贴)

这个问题似乎是由 OpenBLAS 库 libopenblas_haswellp-r0.3.2.so 引起的。我决定删除指向该库的符号链接 (= /usr/lib64/haswell/libopenblas.so.0),然后 R 恢复为使用 /usr/lib64/libopenblas_core2p-r0.3.2.so。现在我从参考计算中得到了正确的结果。

当然我不知道为什么使用 libopenblas_haswellp-r0.3.2.so 会产生不正确的结果,但这似乎是我系统的罪魁祸首。

20 年 2 月 25 日更新

Solus 更新了 OpenBlas 包,现在库是 /usr/lib64/haswell/libopenblas_haswellp-r0.3.7.so;它在我的参考计算中给出了正确的结果。

【讨论】:

  • 感谢您的跟进。有点令人震惊。似乎最好不要使用该操作系统进行数学分析(至少使用 R)
  • 是的,至少目前是这样。除了这个问题,我真的很喜欢这个发行版!
  • @Voltti 这确实很奇怪!似乎 Solus 线程上的人也很无知(至少目前如此)。我很难相信这是 Linux 内核的问题。我刚刚在 VM 中安装了 Solus (Budgie) 4.0 Fortitude,lm 给出了正确的结果。您能否提供有关 Solus 版本、内核版本uname -r 等的详细信息?
  • @MauritsEvers Here you Go。如果我能找到这个问题的线索,我会在下周尝试做一些测试......我在本周剩下的时间里有一些日程安排混乱......而且我真的没有测试设置......但是:)
  • @Voltti 对于它的价值,我已经更新了我的帖子以包含匹配的inxi 输出。内核版本 5.2.x(您的 Solus 操作系统)与 5.3.x(我的设置)的差异之一。也许您可以尝试更新内核并在更新后比较输出。
【解决方案2】:

cmets 变得有点笨拙,所以这里有一个总结和一些进一步的建议。

要重新迭代,请确保

  1. 你是从一个新的 R 终端开始的,
  2. 在你的全局环境中没有对象(例如加载你的本地.Rprofile);要调试这种情况,理想情况下.Rprofile 应该为空;和
  3. 没有恢复之前的 R 会话。

如果您执行了上述操作,ls() 不应返回任何内容,并且像 lm 这样的函数应该引用基本 R 函数。

如果您仍然得到不同的结果,也许可以尝试手动计算 OLS 估计值

X <- model.matrix(Sepal.Length ~ Sepal.Width + as.factor(Species), data = iris)
y <- with(iris, Sepal.Length)
R <- t(X) %*% X
solve(R) %*% t(X) %*% y
#                                  [,1]
#(Intercept)                  2.2513932
#Sepal.Width                  0.8035609
#as.factor(Species)versicolor 1.4587431
#as.factor(Species)virginica  1.9468166

lm 的估计值比较

coef(lm(Sepal.Length ~ Sepal.Width + Species, data = iris))
#(Intercept)       Sepal.Width Speciesversicolor  Speciesvirginica
#  2.2513932         0.8035609         1.4587431         1.9468166

如果结果不同,我建议逐步进行手动 OLS 估计计算并进行比较,例如两台机器上的XR 对象。


更新

我在虚拟机中安装了 Solus (Budgie) 4.0 Fortitude,lm 给出了正确的结果

coef(lm(Sepal.Length ~ Sepal.Width + Species, data = iris))
#(Intercept)       Sepal.Width Speciesversicolor  Speciesvirginica
#  2.2513932         0.8035609         1.4587431         1.9468166

涉及操作系统的详细信息

uname -r
#5.3.10-134.current
gcc --version | head -n 1
#gcc (Solus) 9.2.0
inxi -Fz
#System:    Host: solus Kernel: 5.3.10-134.current x86_64 bits: 64 Desktop: Budgie 10.5.1 Distro: Solus 4.0 
#Machine:   Type: Virtualbox System: innotek product: VirtualBox v: 1.2 serial: <filter> 
#           Mobo: Oracle model: VirtualBox v: 1.2 serial: <filter> BIOS: innotek v: VirtualBox date: 12/01/2006 
#CPU:       Topology: Single Core model: Intel Core i5-6600 bits: 64 type: MCP L2 cache: 6144 KiB 
#           Speed: 3312 MHz min/max: N/A Core speed (MHz): 1: 3312 
#Graphics:  Device-1: VMware SVGA II Adapter driver: vmwgfx v: 2.15.0.0 
#           Display: x11 server: X.Org 1.20.5 driver: vmware unloaded: fbdev,modesetting,vesa resolution: 2560x1440~60Hz 
#           OpenGL: renderer: llvmpipe (LLVM 9.0 256 bits) v: 3.3 Mesa 19.2.5 
#Audio:     Device-1: Intel 82801AA AC97 Audio driver: snd_intel8x0 
#           Sound Server: ALSA v: k5.3.10-134.current 
#Network:   Device-1: Intel 82540EM Gigabit Ethernet driver: e1000 
#           IF: enp0s3 state: up speed: 1000 Mbps duplex: full mac: <filter> 
#           Device-2: Intel 82371AB/EB/MB PIIX4 ACPI type: network bridge driver: piix4_smbus 
#Drives:    Local Storage: total: 40.00 GiB used: 7.33 GiB (18.3%) 
#           ID-1: /dev/sda vendor: VirtualBox model: VBOX HARDDISK size: 40.00 GiB 
#Partition: ID-1: / size: 18.36 GiB used: 7.25 GiB (39.5%) fs: ext4 dev: /dev/dm-1 
#           ID-2: /boot size: 269.0 MiB used: 83.7 MiB (31.1%) fs: ext4 dev: /dev/sda1 
#           ID-3: swap-1 size: 956.0 MiB used: 0 KiB (0.0%) fs: swap dev: /dev/dm-0 
#Sensors:   Message: No sensors data was found. Is sensors configured? 
#Info:      Processes: 159 Uptime: 21h 57m Memory: 3.84 GiB used: 579.1 MiB (14.7%) #Shell: bash inxi: 3.0.36

【讨论】:

  • 1 ) 我用“--vanilla”标志开始 R。 2) 我发现的唯一 Rprofile 文件位于 /usr/lib64/R/library/R/base 中。如果我清除该文件,R 将无法启动。 3) AFAIK 没有以前的会话存在。 ls() 给出字符(0)。我比较了两个代码的结果,是的,它们是不同的;后者给出错误的结果。 lm 函数应该指向“环境:命名空间:stats”,我相信并给出this (pastebin link)。我将尝试将该代码输出与今天窗口的代码输出进行比较。
  • @Voltti 嗯。我很困惑。根据您评论中的详细信息,一切似乎都很好。所以只是要清楚。在您的 Linux 机器上,lm 和“手动”OLS 结果一致?而他们同意你的 Windows 机器?所以换句话说,你的 Linux 机器上的“手动”OLS 估计与 Windows 结果一致?
  • 所以唯一错误的结果是lm Linux/SolusOS 上的函数。 SolusOS 和 Windos 上的手动 OLS 方法以及 Windows 上的 lm 给出完全相同的正确结果。是的,我为此绞尽脑汁;昨天我花了很多时间试图弄清楚我的计算出了什么问题,直到我设法说服自己代码没有问题。虽然我仍在等待那种 I'm such un idiot 类型的错误出现在某个地方。
  • 我在两个操作系统上检查了lm 函数代码输出的输出:link 但唯一真正的区别是字节码,这是意料之中的,对吧...?
  • Maurits Evers,您的虚拟机设置是否仍在运行?我想知道你是否可以在 R 中运行 La_version() 和 La_library() 函数?我分别得到“3.8.0”和“/usr/lib64/haswell/libopenblas_haswellp-r0.3.2.so”。
猜你喜欢
  • 2018-07-06
  • 2021-07-16
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 2020-08-01
相关资源
最近更新 更多