.Internal(La_rs()) returns 在某些安装上有负值,但在其他安装上没有

.Internal(La_rs()) returns negative values on some installations but not others

这是上一个问题的延续: Rfast hd.eigen() returns NAs but base eigen() does not

我一直遇到 .Internal(La_rs((x)) 在不同机器上返回不同结果的问题。

我怀疑这可能与数字格式有关,因为在同一台机器上,如果我另存为 CSV 文件并重新打开,我就不会再得到底片了:

清除Linux安装:

> load("input_to_La_rs.Rdata")
> r <- .Internal(La_rs(as.matrix(x), only.values = FALSE))
> sum(r$values < 0)
[1] 1
> write.csv(x, "test_for_internal.csv", row.names = FALSE)
> x <- read.csv("test_for_internal.csv")
> r <- .Internal(La_rs(as.matrix(x), only.values = FALSE))
> sum(r$values < 0)
[1] 0

但是在我的 Windows 安装(以及基于 CentOS 的 HPC 设置)中,我可以直接打开 rdata 文件并且不会得到负值:

> load("input_to_La_rs.Rdata")
> r <- .Internal(La_rs(x, only.values=TRUE))
> sum(r$values < 0)
[1] 0

这与不同的 R builds/library 版本有关吗?一些我不知道的设置?错误?

编辑:这是一个更新的例子。它似乎工作不一致,即使在这个特定的安装上,有时我确实得到零:

set.seed(123)
bigm <- matrix(rnorm(2000*2000,mean=0,sd = 3), 2000, 2000)
m <- Rfast::colmeans(bigm)
y <- t(bigm) - m
xx <- crossprod(y)
x <- unname(as.matrix(xx))
b <- .Internal(La_rs(x, TRUE))
sum(b$values < 0)
# [1] 1

又一次更新:事实证明,Rfastcolmeans 产生的第一个差异与基本 colMeans 略有不同。

    set.seed(123)
    bigm <- matrix(rnorm(2000*2000,mean=0,sd = 3), 2000, 2000)
    m <- colMeans(bigm)
    m <- colmeans(bigm)
    y <- t(bigm) - m
    xx <- crossprod(y)
    x <- unname(as.matrix(xx))
    b <- .Internal(La_rs(x, TRUE))
    sum(b$values < 0)
  # [1] 1

    m <- colMeans(bigm)
    y <- t(bigm) - m
    xx <- crossprod(y)
    x <- unname(as.matrix(xx))
    b <- .Internal(La_rs(x, TRUE))
    sum(b$values < 0)

我认为差异可以忽略不计。等于或小于 10^(-12) 的矩阵元素的平均差实际上为零。

Rfast中的hd.eigen函数只适用于n < p的情况,即行数小于列数的情况。在 hd.eigen 函数的帮助页面中是对建议该算法的论文的引用。我认为该算法不适用于任何其他情况。也许这就是你获得 NA 的原因。

Rfast2 包含一个名为 "pca" 的函数,它适用于任何一种情况,np.也试试那个。在那里,从 R.

调用 "svd" 有效地执行了 SVD