データ フレーム内のすべての一意のサイトについて、プールされた (実際には重み付けされた) 標準偏差を計算したいと考えています。
これらのサイトの値は、単一種の林分の値であり、広葉樹林分と針葉樹林分を比較できるように、平均値と標準偏差をプールしたいと考えています。
これは広葉樹スタンドの値を持つデータ フレーム (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)ループは完全に間違っていますが、数時間成功しなかった後に思いついたものです。
誰でも私を助けることができますか?
ありがとう、
アントラ