8

データ フレーム内のすべての一意のサイトについて、プールされた (実際には重み付けされた) 標準偏差を計算したいと考えています。

これらのサイトの値は、単一種の林分の値であり、広葉樹林分と針葉樹林分を比較できるように、平均値と標準偏差をプールしたいと考えています。
これは広葉樹スタンドの値を持つデータ フレーム (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検定と比較したい2つのグループに使用されることを知っています。この場合、これらのグループを比較するつもりはありません。私の教授は、この式を使用して重み付けされた sd を取得することを提案しました。この式を必要な方法で組み込んだ 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)ループは完全に間違っていますが、数時間成功しなかった後に思いついたものです。

誰でも私を助けることができますか?

ありがとう、

アントラ

4

2 に答える 2