gpt4 book ai didi

r - r中矩阵累积标准差的高效计算

转载 作者:行者123 更新时间:2023-12-03 21:33:13 26 4
gpt4 key购买 nike

我最近在 r-help 邮件列表上发布了这个问题,但没有得到任何答案,所以我想我也会在这里发布它,看看是否有任何建议。

我正在尝试计算矩阵的累积标准偏差。我想要一个函数,它接受一个矩阵并返回一个相同大小的矩阵,其中输出单元格 (i,j) 设置为第 1 行和第 i 行之间输入列 j 的标准偏差。 NA 应该被忽略,除非输入矩阵本身的单元格 (i,j) 是 NA,在这种情况下,输出矩阵的单元格 (i,j) 也应该是 NA。

我找不到内置函数,所以我实现了以下代码。不幸的是,这使用了一个循环,对于大型矩阵来说最终会有点慢。是否有更快的内置功能,或者有人可以提出更好的方法吗?

cumsd <- function(mat)
{
retval <- mat*NA
for (i in 2:nrow(mat)) retval[i,] <- sd(mat[1:i,], na.rm=T)
retval[is.na(mat)] <- NA
retval
}

谢谢。

最佳答案

您可以使用 cumsum从方差/标准差的直接公式计算必要的总和到矩阵上的矢量化运算:

cumsd_mod <- function(mat) {
cum_var <- function(x) {
ind_na <- !is.na(x)
nn <- cumsum(ind_na)
x[!ind_na] <- 0
cumsum(x^2) / (nn-1) - (cumsum(x))^2/(nn-1)/nn
}
v <- sqrt(apply(mat,2,cum_var))
v[is.na(mat) | is.infinite(v)] <- NA
v
}

仅供对比:
set.seed(2765374)
X <- matrix(rnorm(1000),100,10)
X[cbind(1:10,1:10)] <- NA # to have some NA's

all.equal(cumsd(X),cumsd_mod(X))
# [1] TRUE

关于时间:
X <- matrix(rnorm(100000),1000,100)
system.time(cumsd(X))
# user system elapsed
# 7.94 0.00 7.97
system.time(cumsd_mod(X))
# user system elapsed
# 0.03 0.00 0.03

关于r - r中矩阵累积标准差的高效计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2765374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com