R:使用NA计算总体标准偏差
由于R:使用NA计算总体标准偏差,r,R,由于sd计算样本标准偏差,而不是总体标准偏差,我必须编写一个函数来获得总体标准偏差 当没有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,
sd
计算样本标准偏差,而不是总体标准偏差,我必须编写一个函数来获得总体标准偏差
当没有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
>设置种子(1)
>mf1 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应用(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
mf2 mf2[c(2,5),3]mf2
[,1] [,2] [,3]
[1,] 34 95 72
[2,]43 70 NA
[3,] 62 67 80
[4,] 92 15 55
[5,]28 NA
[6,] 91 26 100
>应用(mf2,1,pop.sd)
[1] 25.152866 NA 7.586538 31.443070 NA 32.967998
你能帮我把函数设置为允许NAs,这样我就可以得到第2行和第5行的一些数字了吗
谢谢。我们可以在
平均值和总和中使用na.rm=TRUE
来解释na元素
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
我们也可以使用向量化的行和
和行平均数
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
如果一组数字中有一些缺失,那么它们的标准偏差应该是多少?@Hugh,它们应该是13.5和0。你没有领会我的意思。通常,在计算pop.sd
时,您应该设法理解为什么缺少这些值,而不是简单地排除它们。如果你说第二个值应该是0,那就意味着[5,3]的值是28。@Hugh问得好,但这不是我的问题。技术上我需要如何计算它。谢谢。谢谢你的建议。由于之前我没有将na.rm
放在均值和求和中(我只尝试将na.rm
放在函数末尾),您的评论让我对这一点有了深刻的了解。但是,由于长度(x)不能解释NA(它对所有行返回3),您建议的函数的标准偏差不正确。@ShinziKatoh我将长度(x)
更改为总和(!is.NA(x))
,但它仍然给出了相同的结果result@ShinziKatoh请让我知道您计算的逻辑。将length(x)
更改为“sum(!is.na(x)
的解决方案效果非常好。因为只有第2行和第5行有NAs,所以除2行以外的所有结果都应该相同。如您所见,第2行的sd从11.022704更改为11.022704(通过使用length(x)
获得)到13.50000(通过使用sum(!is.na(x)
获得)。第五行的结果应该是零,因为所有元素都是相同的。非常感谢!!@ShinziKatoh是的,我的解决方案提供了您想要的输出。感谢您的反馈。
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