R语言中使用手动指定的已知均值计算分组标准差的方法
实现方法
方法1:直接在summarise中写计算逻辑(无需自定义函数)
已知均值固定为0时,标准差的计算可以直接基于平方和完成,天然适配dplyr的分组运算规则,写法和你之前用内置sd()的逻辑几乎一致:
- 如需计算总体标准差(分母为样本量n,均值已知无需估计时常用):
ans <- temp %>% group_by(permno) %>% summarise(std_fixed = sqrt(sum(ret^2, na.rm = TRUE)/n()))
- 如需和内置
sd()保持一致的无偏估计逻辑(分母为n-1):
ans <- temp %>% group_by(permno) %>% summarise(std_fixed_unbiased = sqrt(sum(ret^2, na.rm = TRUE)/(n()-1)))
方法2:封装自定义函数复用
如果需要频繁使用固定均值计算标准差,可以先封装自定义函数,后续分组调用和内置函数用法完全一致:
- 先定义函数:
# 参数说明: # x: 要计算标准差的向量 # mu: 已知的固定均值,默认设为0 # unbiased: 是否使用无偏估计(分母n-1),默认开启 # na.rm: 是否自动忽略NA值,默认关闭 sd_fixed_mean <- function(x, mu = 0, unbiased = TRUE, na.rm = FALSE) { if(na.rm) x <- na.omit(x) n <- length(x) if(n == 0) return(NA_real_) sum_sq <- sum((x - mu)^2) denominator <- ifelse(unbiased, n - 1, n) return(sqrt(sum_sq / denominator)) }
- 分组调用,和你之前用
sd()的写法完全一致:
ans <- temp %>% group_by(permno) %>% summarise(std = sd_fixed_mean(ret, mu = 0, na.rm = TRUE))
注意事项
如果你的ret列存在缺失值,记得传入na.rm = TRUE参数,否则计算结果会返回NA,行为和R内置的sd()函数一致。
内容的提问来源于stack exchange,提问作者akuhikar3
相关产品推荐
相关产品推荐

