R中有这样的"colsd"吗?

sac*_*cvf 23 r

我在我的代码中使用colSums但我还需要总和旁边的标准偏差.我在互联网上搜索,发现这个页面只包含:

colSums
colMeans
Run Code Online (Sandbox Code Playgroud)

http://stat.ethz.ch/R-manual/R-devel/library/base/html/colSums.html

我试过这个:

colSd
Run Code Online (Sandbox Code Playgroud)

但是我收到了这个错误:

Error: could not find function "colSd"
Run Code Online (Sandbox Code Playgroud)

我如何做同样的事情,但标准偏差:

colSd
Run Code Online (Sandbox Code Playgroud)

这是代码:

results <- colSums(x,na.rm=TRUE)#### here I want colsd
Run Code Online (Sandbox Code Playgroud)

sgi*_*ibb 25

我想提供第四种(非常类似于@Thomas)方法和一些基准测试:

library("microbenchmark")
library("matrixStats")

colSdApply <- function(x, ...)apply(X=x, MARGIN=2, FUN=sd, ...)
colSdMatrixStats <- colSds

colSdColMeans <- function(x, na.rm=TRUE) {
  if (na.rm) {
    n <- colSums(!is.na(x)) # thanks @flodel
  } else {
    n <- nrow(x)
  }
  colVar <- colMeans(x*x, na.rm=na.rm) - (colMeans(x, na.rm=na.rm))^2
  return(sqrt(colVar * n/(n-1)))
}

colSdThomas <- function(x)sqrt(rowMeans((t(x)-colMeans(x))^2)*((dim(x)[1])/(dim(x)[1]-1)))

m <- matrix(runif(1e7), nrow=1e3)

microbenchmark(colSdApply(m), colSdMatrixStats(m), colSdColMeans(m), colSdThomas(m))

# Unit: milliseconds
#                 expr      min       lq   median       uq      max neval
#        colSdApply(m) 435.7346 448.8673 456.6176 476.8373 512.9783   100
#  colSdMatrixStats(m) 344.6416 357.5439 383.8736 389.0258 465.5715   100
#     colSdColMeans(m) 124.2028 128.9016 132.9446 137.6254 172.6407   100
#       colSdThomas(m) 231.5567 240.3824 245.4072 274.6611 307.3806   100


all.equal(colSdApply(m), colSdMatrixStats(m))
# [1] TRUE
all.equal(colSdApply(m), colSdColMeans(m))
# [1] TRUE
all.equal(colSdApply(m), colSdThomas(m))
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

  • 我认为要处理`NA`你必须使用类似`n < - colSums(!is.na(x))`的东西. (2认同)

Hen*_*nry 6

colSds并且rowSdsmatrixStats包中许多类似函数中的两个

  • 那个包中的那些功能实际上并没有做任何花哨的事情; 它们和`apply(x,2,sd)`一样慢. (5认同)
  • 不再。这些天它们都是用 C/C++ 编写的 (2认同)

asb*_*asb 5

使用以下内容:

colSd <- function (x, na.rm=FALSE) apply(X=x, MARGIN=2, FUN=sd, na.rm=na.rm)
Run Code Online (Sandbox Code Playgroud)

  • @sacvf,无论您发表多少评论“我的结果不适用,知道为什么吗?”,我们都无法提供帮助,除非我们看到您有问题的数据。您应该将一些精力投入到使您的问题可重现上。 (7认同)

小智 5

我相信我已经找到了一个更优雅的解决方案diag(sqrt(var(data)))

这有助于我获得每列的标准差。但是,它确实会在此过程中计算一堆额外不必要的协方差(及其平方根),因此它不一定是最有效的方法。但如果你的数据很小,它的效果就很好。

编辑:我刚刚意识到这sqrt(diag(var(data)))可能更有效一些,因为它更早地删除了不必要的协方差项。


小智 5

这是计算列的标准偏差的最快和最短的方法:

sqrt(diag(cov(data_matrix)))
Run Code Online (Sandbox Code Playgroud)

由于协方差矩阵的对角线由每个变量的方差组成,我们执行以下操作:

  • 使用计算协方差矩阵 cov
  • 使用提取矩阵的对角线 diag
  • 使用对角线值的平方根sqrt以获得标准偏差

我希望有帮助:)