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