如何矢量化sapply函数实现R语言累积偏度计算?
修正矢量化的累积偏度计算函数
你的skewness2函数存在三个核心逻辑错误,导致结果偏离预期:
- 分子计算逻辑错误:你先对每个
x_i - cmu_i做累积求和再三次方,这和原逻辑中对前k项的(x_i - mu_k)^3求和完全不符 - 平方根参数错误:原逻辑中每个累积窗口对应的是
sqrt(k)(当前窗口长度),而非整个向量的sqrt(n) - 分母计算逻辑错误:类似分子问题,你先对
(x_i - cmu_i)^2累积求和再开3/2次方,而非先计算前k项相对于mu_k的平方和再开方
以下是修正后的矢量化函数,完全匹配原cskewness的计算逻辑:
skewness2 <- function(.x) { n <- length(.x) k <- seq_len(n) # 计算累积的一、二、三次方和 csum1 <- cumsum(.x) csum2 <- cumsum(.x^2) csum3 <- cumsum(.x^3) # 每个累积窗口对应的均值 mu <- csum1 / k # 计算分子:sum((x_i - mu_k)^3),通过代数展开避免循环 sum_cubed <- csum3 - 3 * mu * csum2 + 3 * mu^2 * csum1 - k * mu^3 # 计算分母:sum((x_i - mu_k)^2)^(3/2) sum_squared <- csum2 - 2 * mu * csum1 + k * mu^2 den <- sum_squared^(3/2) # 生成最终累积偏度结果,k=1时分母为0,结果为NaN sqrt(k) * sum_cubed / den }
测试验证
使用输入x <- c(1,2,4,5,8)测试:
> cskewness(x) [1] NaN 0.0000000 0.3818018 0.0000000 0.4082483 > skewness2(x) [1] NaN 0.0000000 0.3818018 0.0000000 0.4082483
内容的提问来源于stack exchange,提问作者MCP_infiltrator
相关产品推荐
相关产品推荐

