如何在R语言中编写函数同时计算向量y的偏度与峰度
R语言实现同时计算偏度与峰度的函数
首先还原问题里的向量生成代码(优化了冗余赋值):
set.seed(1112) y <- 11 + sqrt(12) * rnorm(5000) y[sample(5000, size = 200, replace = FALSE)] <- NaN
下面提供两种实现方案:
方案一:手动实现(无第三方包依赖)
基于统计公式编写函数,自动处理向量中的NaN缺失值,采用Fisher校正后的偏度和峰度(让正态分布的峰度为0):
skew_kurt <- function(vec) { # 过滤缺失值 vec_clean <- vec[!is.na(vec)] n <- length(vec_clean) # 样本量不足时抛出提示 if (n < 4) stop("有效样本量小于4,无法计算峰度") # 计算基础统计量 mu <- mean(vec_clean) s <- sd(vec_clean) # Fisher校正偏度 skewness <- (n / ((n - 1) * (n - 2))) * sum((vec_clean - mu)^3) / (s^3) # Fisher校正峰度(正态分布峰度为0) kurtosis <- (n * (n + 1) / ((n - 1) * (n - 2) * (n - 3))) * sum((vec_clean - mu)^4) / (s^4) - (3 * (n - 1)^2) / ((n - 2) * (n - 3)) # 返回包含偏度和峰度的列表 return(list(skewness = skewness, kurtosis = kurtosis)) }
调用函数并查看结果:
# 计算结果 result <- skew_kurt(y) # 输出偏度 result$skewness # 输出峰度 result$kurtosis
方案二:借助第三方包(简洁高效)
如果不想手动实现,可使用moments包的内置函数,同样需先过滤缺失值:
# 安装包(首次使用时执行) # install.packages("moments") library(moments) skew_kurt_package <- function(vec) { vec_clean <- vec[!is.na(vec)] return(list(skewness = skewness(vec_clean), kurtosis = kurtosis(vec_clean))) } # 调用函数 result2 <- skew_kurt_package(y) print(result2)
注意:moments包中的kurtosis()默认返回Fisher校正后的结果(正态分布峰度为0),和手动实现逻辑一致。
内容的提问来源于stack exchange,提问作者demetrio845
相关产品推荐
相关产品推荐

