我的问题的第一部分是,是否有比标准偏差更快的计算方法
mySD = apply(myData,1,sd)
问题的第二部分是如何去除异常值(距离每条线的平均值3 SD)并重新计算每条线的SD。
问题的第三部分是我计算每一行的SD,如何获取超过一定阈值的那些(例如0.05)?
我的矩阵有3千万个roaw和50列。
如果有比R更快的方式(例如perl或matlab),我也很乐意尝试。
...
我有一个包含3000万行和50列的矩阵。对于每一行,我想删除异常值并计算标准偏差(SD)。所以我将拥有3000万SD。 然后我想拿起SD最高的那些线(前5%)。
我尝试了R,但即使将数据加载到R也需要花费大量时间。我甚至将数据保存为* RData。但仍然要慢下来,耗费太多时间。
有没有更快的方法来做这些事情?在r或perl或matlab中?
答案 0 :(得分:3)
您的问题有两个部分,即高效计算和处理大数据。
假设您有一个更易于管理的数据集m
,其中包含5%的3000万行和50列(这大约占我8Gb的30%;内存耗尽会使一切运行缓慢,因此您需要让我们知道这类信息。)
nrow <- .05 * 30000000
ncol <- 50
m <- matrix(rnorm(nrow * ncol), nrow)
也许你会编写一个函数clean
,可以有效地删除每行的异常值;它可能使用另一个有效计算行标准偏差的函数
rowSD <- function(m) {
## efficiently calculate row-wise SD
## naive: apply(m, 1, sd, na.rm=TRUE)
## update via @BenBolker / http://stackoverflow.com/questions/16046820/change-row-values-to-zero-if-less-than-row-standard-deviation
sqrt(rowSums((m - rowMeans(m, na.rm=TRUE))^2, na.rm=TRUE) / (ncol(m)-1))
}
clean <- function(m) {
## efficiently implement your strategy for identifying outliers
m[abs(m - rowMeans(m)) > 3 * rowSD(m)] <- NA # fast enough
m
}
对于矩阵m
,rowSD(m)
的朴素实现大约需要56秒,而@BenBolker的更新大约需要1.4秒; clean(sd)
需要大约5秒。两者都制作了多份副本并通过数据,远非理想。
考虑以大小为nrow
的块处理您的数据。如果您清理了两个块m1
,m2
,则可以将它们组合起来并保留最高值
sd <- c(rowSD(m1), rowSD(m2))
## if sorted, sd[idx] would be the value that separate high and low
idx <- nrow(result) + nrow(m) - nrow
keep <- sd > sort.int(sd, partial=idx)[idx] # index correct, or off-by-one?
## replace smallest in m1 with largest in m2
m1[!head(keep, nrow(m1)),] <- m2[tail(keep, nrow(m2)),]
由于你正在进行矩阵运算,听起来你的数据都是数字的,scan
,以块的形式读取文件,是适当的输入。
conn <- file("myfile", "r")
result <- matrix(0, nrow, ncol)
while (length(x <- scan(con, nmax = nrow * ncol))) {
m <- clean(matrix(x, nrow, ncol, byrow=TRUE))
sd <- c(rowSD(result), rowSD(m))
idx <- nrow(result) + nrow(m) - nrow
keep <- sd > sort.int(sd, partial=idx)[idx]
result[!head(keep, nrow),] <- m[tail(keep, nrow(m)),]
}
close(conn)
然后 result
是具有最高标准差的清理行的所需集合。
答案 1 :(得分:1)
library(bigmemory)
?read.big.matrix
首先。然后查看biganalytics
,bigtabulate
,biglm
等