7

很抱歉问这个......这肯定是一个常见问题解答,这是一个愚蠢的问题,但它一直困扰着我。假设我想获取数据框中每个数字列的方差,例如

df <- data.frame(x=1:5,y=seq(1,50,10))

自然,我尝试

var(df)

而不是给我我希望的东西,就像

  x    y
2.5  250

我明白了

     x   y
x  2.5  25
y 25.0 250

它在对角线上有方差,在其他位置有协方差。当我查找 help(var) 并读到“var 只是 cov 的另一个接口”时,这是有道理的。当然,方差是变量与其自身之间的协方差。输出有点混乱,但我可以沿对角线读取,或者使用diag(var(df))sapply(df, var)或或通过反复lapply(df, var)调用and来生成方差。vardf$xdf$y

但为什么?方差是一种常规的、基本的描述性统计数据,仅次于均值。将它应用于数据框的列不应该是完全和完全微不足道的吗?当我只要求方差时,为什么要给我协方差?只是好奇。感谢您对此的任何评论。

4

3 回答 3

10

惯用的方法是

sapply(df, var)

var 有一种data.framesdata.frames通过强制转换为 a处理的方法matrix

Variance是常规的基本描述性统计量,协方差和相关性也是如此。它们都是相互关联且有趣的,特别是如果您打算使用线性模型。

您总是可以创建自己的功能来执行您想要的

Var  <- function(x,...){
  if(is.data.frame(x)) {
   return(sapply(x, var,...))} else { return(var(x,...))}
}
于 2013-03-27T03:47:21.917 回答
9

这记录在 中?var,即:

Description:

     ‘var’, ‘cov’ and ‘cor’ compute the variance of ‘x’ and the
     covariance or correlation of ‘x’ and ‘y’ if these are vectors.  If
     ‘x’ and ‘y’ are matrices then the covariances (or correlations)
     between the columns of ‘x’ and the columns of ‘y’ are computed.

其中“矩阵”文本表示类的对象"matrix""data.frame"

var没有传统意义上的数据帧方法。var只需将输入数据帧强制转换为矩阵as.matrix,然后调用cov该矩阵。

为了回答为什么这个问题,我猜方差与协方差的概念密切相关,并且为了保持代码简单,R Core 为类矩阵对象的协方差编写了一个实现,并将其用于方差,因为你最有可能从矩阵中得到的东西。

或者更简洁地说;这就是 R Core 实现这一点的方式。学会忍受它。:-)

另请注意,R 正在远离具有类似功能mean并对sd数据框的组件(列)进行操作。如果你想应用这些函数中的任何一个,包括var,你需要调用类似的东西:

apply(foo, 2, mean) ## for matrices
sapply(foo, mean) ## for data frames

或更快的特定替代品

colMeans(foo)

在这种情况下,我怀疑这diag(var(df))将是获取差异的最有效方法,而不是通过函数族var之一重复调用。apply diag(var(df))不太可能比前者更快,sapply(df, var)因为前者必须计算所有协方差和方差。

于 2013-03-27T04:05:40.350 回答
1

@GavinSimpson 已经涵盖了您的实际答案。因为var你也可以只使用:

sd(df)^2
# x     y 
# 2.5 250.0 

通过这样做,您将看到@GavinSimpson 对 R 的含义“不再具有类似的功能mean并对sd数据框的组件(列)进行操作”。已弃用意味着该功能可能会随着即将发生的 R 版本更改而停用,如果您不注意警告并进行适当更改,您的代码可能会中断:

警告消息:sd() 已弃用。使用 sapply(*, sd) 代替。

所以我们可以使用:

sapply(df,sd)^2
# x     y 
# 2.5 250.0 

这给了我们完全相同的结果。

但是,这样做有点愚蠢,因为您实际上是在调用(sqrt(var(x, na.rm = na.rm)))^2每一列!相反,正如@mnel 所建议的那样,sapply( df , var)您应该如何获得每个列向量的方差。

于 2013-03-27T07:07:11.180 回答