首页 > 解决方案 > 在 R 中手动计算方差

问题描述

我在这里需要你的帮助。我需要在 R 中手动计算方差。我已经用这个代码实现了它,它对于缺失值和非数字数据类型不够健壮。

a= c(1,2,3,4,5)
k=mean(a,na.rm = T)
storage=a
for(i in 1:length(a)) {
  storage[i]= ((i-k)^2)
}
storage =sum((storage)/(length(a)-1))
storage

当我有 a= c(1,2,3,4,5,c,NA) 时我遇到了麻烦请问我将如何编辑代码?

标签: rstatistics

解决方案


首先,有几点观察:

  1. 在 R 中,您可以对整个向量进行操作。例如(c(1, 2, 3))^2产量1 4 9。没有必要使用for循环。
  2. mean不是唯一需要的功能na.rm = TRUEsum也是。
  3. 在 R 中,原子向量(几乎是所有不是列表的向量)只能具有一种数据类型的元素。有四种主要类型:逻辑、整数、双精度和字符。如果向量中有多个类型,则所有元素都被强制为相同,顺序如下:字符→双精度→整数→逻辑。例如,c(1, 'c')将返回字符向量 "1", "c"。这就是你遇到麻烦的原因。(注意:如果NA向量中有一个,它的类型将与向量的类型相同。)

不幸的是,对于那个特定的向量,c(1,2,3,4,5,c,NA)我认为没有一种简单的方法可以将其强制为整数。那是因为它是一个将函数作为元素的列表:函数c()

但是,只要x是原子向量,此函数就可以工作:

variance <- function(x){
  x = as.numeric(x)
  x = na.omit(x)
  m = mean(x)
  return(
    sum((x-m)^2, na.rm = TRUE)/(length(x) - 1)
  )
}

首先我们将向量强制转换为数字,这样我们就可以处理像c(1, 2, 'a'). 然后我们去掉NA's,这样我们就不用写andna.rm = TRUE了。然后我们只写公式。meansum

一个小的不便之处在于,当将字符向量转换为数字时,我们会收到一条警告说NAs 已生成。如果我们改写,这可以解决x = suppressWarnings(as.numeric(x))

如果您希望您的函数能够处理带有函数的列表,请告诉我。


推荐阅读