2016-07-17 20 views
1

sdは母集団標準偏差ではなく標本標準偏差を計算するので、母集団標準偏差を得る関数を書く必要がありました。R:母集団標準偏差をNAと計算する

NAがない場合、以下のように簡単に行うことができます。

> set.seed(1) 
> mf1<-matrix(sample(c(10:100),18, replace=T),ncol=3) 
> mf1 
    [,1] [,2] [,3] 
[1,] 34 95 72 
[2,] 43 70 44 
[3,] 62 67 80 
[4,] 92 15 55 
[5,] 28 28 75 
[6,] 91 26 100 
> pop.sd<-function(x){sqrt(sum((x-mean(x))^2)/length(x))} 
> apply(mf1,1,pop.sd) 
[1] 25.152866 12.498889 7.586538 31.443070 22.156012 32.967998 

ただし、NAsがある場合、対応する行にはNAが返されます。

> mf2<-mf1 
> mf2[c(2,5),3]<-NA 
> mf2 
    [,1] [,2] [,3] 
[1,] 34 95 72 
[2,] 43 70 NA 
[3,] 62 67 80 
[4,] 92 15 55 
[5,] 28 28 NA 
[6,] 91 26 100 
> apply(mf2, 1, pop.sd) 
[1] 25.152866  NA 7.586538 31.443070  NA 32.967998 

あなたは私もいくつかの第二の数値と5行を持つことができるように、機能は、NASを許可するために私を助けてもらえますか?

ありがとうございました。

+0

することができますそれらのうちのいくつかが欠落している場合、数値セットの標準偏差はどのようになるべきですか? – Hugh

+0

@Hugh彼らは13.5と0でなければなりません。 –

+1

あなたは私のポイントを欠場します。一般に、 'pop.sd'を計算するときに値を単純に除外するのではなく、なぜ値が欠落しているのかを理解する必要があります。 2番目の値が0でなければならないとすると、[5,3]の値は28になります。 – Hugh

答えて

1

meansumには、NA要素を考慮してna.rm=TRUEを使用できます。

pop.sd<-function(x){sqrt(sum((x-mean(x, na.rm=TRUE))^2, 
           na.rm=TRUE)/sum(!is.na(x)))} 
apply(mf2, 1, pop.sd) 
#[1] 25.152866 13.500000 7.586538 31.443070 0.000000 32.967998 

これはまた、代わりに行をループの 'MF1'

apply(mf1,1,pop.sd) 
#[1] 25.152866 12.498889 7.586538 31.443070 22.156012 32.967998 

に同じ結果を与える必要があり、我々はまた、私たちベクトル化rowSumsrowMeans

sqrt(rowSums((mf1-rowMeans(mf1, na.rm=TRUE))^2, na.rm=TRUE)/ncol(mf1)) 
#[1] 25.152866 12.498889 7.586538 31.443070 22.156012 32.967998 

sqrt(rowSums((mf2-rowMeans(mf2, na.rm=TRUE))^2, na.rm=TRUE)/ncol(mf2)) 
#[1] 25.152866 11.022704 7.586538 31.443070 0.000000 32.967998 
+0

お寄せいただきありがとうございます。前に平均と和の両方に 'na.rm'を入れることはできませんでした(私は関数の最後に' na.rm'を入れようとしました)、あなたのコメントは私にそれについての大きな洞察を与えました。しかし、length(x)はNAを考慮していない(すべての行で3を返します)ので、提案した関数からの標準偏差は正しくありません。 –

+0

@ShinziKatoh 'length(x)'を 'sum(!is.na(x))'に変更しましたが、それでも同じ結果が得られます – akrun

+0

@ShinziKatoh計算のロジックを教えてください。 – akrun

関連する問題