1. ホーム
  2. r

[解決済み] Rでプールされた標準偏差を計算する方法は?

2022-02-24 07:21:46

質問

データフレーム内のすべてのユニークサイトについて、プールされた(実際には加重された)標準偏差を計算したいのですが、どうすればよいですか?

これらのサイトの値は単一種の森林スタンドの値であり、広葉樹スタンドと針葉樹スタンドを比較できるように、平均値と標準偏差をプールしたいのです。
これは、広葉樹林のスタンドの値が入ったデータフレーム(df)である。

keybl           n   mean    sd
Vest02DenmDesp  3   58.16   6.16
Vest02DenmDesp  5   54.45   7.85
Vest02DenmDesp  3   51.34   1.71
Vest02DenmDesp  3   59.57   5.11
Vest02DenmDesp  5   62.89   10.26
Vest02DenmDesp  3   77.33   2.14
Mato10GermDesp  4   41.89   12.6
Mato10GermDesp  4   11.92   1.8
Wawa07ChinDesp  18  0.097   0.004
Chen12ChinDesp  3   41.93   1.12
Hans11SwedDesp  2   1406.2  679.46
Hans11SwedDesp  2   1156.2  464.07
Hans11SwedDesp  2   4945.3  364.58

Keyblはサイトのコードです。プールされたSDの計算式は

s=sqrt((n1-1)*s1^2+(n2-1)*s2^2)/(n1+n2-2))

(写真を貼ることができず、数式に直接アクセスできるリンクも見つからず、申し訳ありません)

ここで、2はグループの数なので、サイトによって変わります。これはt-testや2つのグループを比較したいときに使うものだと思います。この場合、私はこれらのグループを比較することを計画していない。教授が、この式を使って重み付き標準偏差を求めることを勧めてくれました。私はこの数式を私が必要とする方法で組み込んだR関数を見つけられませんでしたので、自分で作ろうとしました。しかし、私はRの初心者で、関数やループを作るのがあまり得意ではありません、したがって、あなたの助けを期待しています。

今のところ、こんな感じです。

sd=function (data) {
nc1=data[z,"nc"]
sc1=data[z, "sc"]
nc2=data[z+1, "nc"]
sc2=data[z+1, "sc"]
sd1=(nc1-1)*sc1^2 + (nc2-1)*sc2^2
sd2=sd1/(nc1+nc2-length(nc1))
sqrt(sd2)
}

splitdf=split(df, with(df, df$keybl), drop = TRUE)

for (c in 1:length(splitdf)) {
for (i in 1:length(splitdf[[i]])) {
    a = (splitdf[[i]])
    b =sd(a)
    }
}

1) 関数自体が正しくなく、本来の値より少し低い値を出してしまい、その理由がわかりません。z+1 が最後の行に到達したときに停止しないことが原因でしょうか?もしそうなら、どのように修正すればいいのでしょうか?

2) ループは全く間違っていますが、数時間経ってもうまくいかなかったので、思いついたものです。

誰か助けてください。

ありがとうございます。

アントラ

解決方法は?

独立性の仮定(共分散項はゼロと仮定できる)の下でのプールされたSDは次のようになります: sqrt( sum_over_groups[ (var)/sum(n)-N_groups)] )

     lapply( split(dat, dat$keybl), 
          function(dd) sqrt( sum( dd$sd^2 * (dd$n-1) )/(sum(dd$n-1)-nrow(dd)) ) )
#-------------------------
$Chen12ChinDesp
[1] 1.583919

$Hans11SwedDesp
[1] Inf

$Mato10GermDesp
[1] 11.0227

$Vest02DenmDesp
[1] 9.003795

$Wawa07ChinDesp
[1] 0.004123106