7

これを聞いて申し訳ありません...それは確かにFAQであり、ちょっとばかげた質問ですが、私を悩ませています. 次のような、データフレーム内のすべての数値列の分散を取得したいとします。

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)呼び出すことで分散のみを生成できます。vardf$xdf$y

しかし、なぜ?分散は、日常的で基本的な記述統計量であり、意味に次ぐものです。それをデータフレームの列に適用するのは完全に簡単ではないでしょうか? 分散のみを求めたのに、なぜ共分散を教えてくれるのですか? ちょっと興味があるんだけど。これに関するコメントをありがとう。

4

3 に答える 3

10

慣用的なアプローチは

sapply(df, var)

var data.framesdata.framesに強制することで処理するメソッドがあり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コアがこれを実装した方法です。それと一緒に暮らすことを学びましょう。:-)

また、R は、データ フレームのコンポーネント (列) のような関数meanや操作から遠ざかっていることにも注意してください。sdを含むこれらの関数のいずれかを適用する場合は、次のvarように呼び出す必要があります。

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

またはより高速な特定の代替手段

colMeans(foo)

この例では、関数ファミリーの1 つを介して繰り返しdiag(var(df))呼び出す代わりに、分散を取得する最も効率的な方法になると思います。varapply 前者はすべての共分散と分散を計算する必要があるため、前者diag(var(df))よりも高速になる可能性は低いです。sapply(df, var)

于 2013-03-27T04:05:40.350 に答える
1

あなたの実際の答えは@GavinSimpsonによってカバーされています。次のvarように使用することもできます。

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

そうすることで、R について @GavinSimpson が何を意味するかがわかるでしょmeansd。非推奨とは、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 に答える