【发布时间】:2013-06-03 04:29:52
【问题描述】:
我想计算我的数据框中所有唯一站点的合并(实际加权)标准差。
这些站点的值是单一物种林分的值,我想合并平均值和标准差,以便我可以比较阔叶林和针叶林。
这是具有阔叶林值的数据框 (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 检验,并且要比较两组。在这种情况下,我不打算比较这些组。我的教授建议我使用这个公式来获得加权标准差。我没有找到以我需要的方式包含此公式的 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) 循环完全错误,但这是我在几个小时没有成功后能想到的。
有人可以帮助我吗?
谢谢,
安特拉
【问题讨论】:
-
这里缺少括号:s=sqrt(((n1-1)*s1^2+(n2-1)*s2^2)/(n1+n2-2))
标签: r function for-loop standard-deviation