2013-03-27 7 views
6

これは申し訳ありませんが...確かにFAQですが、それは愚かな質問ですが、それは私を悩ませています。私は、このようななぜvarはRでcovのように動作しますか?

当然
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 
を取得します対角線に分散を有する

、および他の場所の共分散を含む。私は助け(var)を検索し、 "varは単なる別のインターフェースです"と読むと意味があります。分散はもちろん、変数とそれ自身の共分散です。出力は少し混乱しますが、私は対角に沿って読むことができます。または、diag(var(df)),sapply(df, var)、またはlapply(df, var)を使用して、またはを繰り返しdf$xdf$yに繰り返し呼び出すことによって、分散のみを生成することができます。

なぜですか?分散は日常的で基本的な説明的な統計であり、次に重要な意味を持ちます。それをデータフレームの列に適用することは、完全に、そして全く些細なことではないでしょうか?なぜ私は分散を求めただけで私に共分散を与えるのですか?ちょっと興味があるんだけど。これに関するコメントありがとうございます。

+2

[This](http://stackoverflow.com/q/9424311/324364)の質問も参考になるかもしれません。 – joran

答えて

10

慣用アプローチは

sapply(df, var) 

varがどのmatrixに強制変換によるdata.framesディールdata.framesするための方法を有しています。

Varianceは、日常的な基本的な記述統計であり、共分散と相関も同様です。特に、線形モデルを使用することを目指している場合、それらはすべて相互にリンクされ、興味深いものです。 「行列」によって

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"のオブジェクトを意味:あなたは常にあなたがこれはつまり、?varに記載されて

Var <- function(x,...){ 
    if(is.data.frame(x)) { 
    return(sapply(x, var,...))} else { return(var(x,...))} 
} 
+0

'var'はデータフレームのためのメソッドを持っていると言うのは少し紛らわしいかもしれません。それは単語法の通常のRの意味ではない(S3法またはS4法)。データフレームは単純に行列に変換され、次に「cov」が適用されます。 –

+0

@GavinSimpson - 編集していただきありがとうございます。 – mnel

+0

mnel、GavinSimpson、SimonO101ありがとうございます。これらは、ジョランのリンクと同様に、非常に有益な回答です。私はそれらすべてを投票したにもかかわらず、私は1つの答えとしてマークすることはしません。わかった。 – Mars

8

たいと実行する独自の機能を作成することができ

および。

varには、従来の意味でのデータフレームの方法はありません。 varは、単に入力データフレームをas.matrixで行列に変換し、その行列上でcovを呼び出します。

なぜ、分散が共分散の概念に密接に関連していると思いますか?Rコアは行列のようなオブジェクトの共分散のための単一の実装を書いて、あなたが行列から欲しい最も可能性の高いものです。

以上簡潔に;それがRコアがこれをどのように実装したかです。それを生きることを学ぶ。:-)

また、Rは、meansdのような機能がデータフレームのコンポーネント(列)上で動作するようになっています。あなたはvar含めて、これらの機能のいずれかを適用する場合は、あなたが何かを呼び出すために必要とされています

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

またはより高速な特定の選択肢この場合

colMeans(foo) 

を、私は diag(var(df))が可能になると思われますを applyファシリティファミリの1つを介して繰り返し呼び出す代わりに、分散を取得する最も効率的な方法です。 diag(var(df))は、 sapply(df, var)より速くはなりません。これは、前者がすべての共分散と分散を計算しなければならないためです。

+0

+1と私は従来の 'メソッド'の欠如に注意するために私の応答を編集しました – mnel

+0

私はdiag(var(df))かsapply(df、var)の方が速いのか不思議でした。この例では、 'df Mars

+0

@Marsいいえ、それは間違っています。呼び出し全体は 'diag(var(df))'です。あなたはそれを「サプリー」しません。 'var(df)'は、 'df'の分散共分散行列全体を返します。あなたが望むビットは対角にあるので、 'diag()'でそれらを抽出します。とにかく、この方法でも共分散を計算するようになりましたので、 'sapply'バージョンよりも遅い可能性があります。 –

1

実際の回答は@GavinSimpsonの対象となっています。 varのためにあなたはまた、単に使用することができます

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

そして、そうすることによって、あなたは@GavinSimpsonは、Rについては何を意味するかが表示されます "は離れ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)は、各列ベクトルの分散をどのように取得するかです。

関連する問題