gsl_stats_skew 返回错误结果

问题描述

我在 C 应用程序上使用 GSL 库 1.15,我对计算双精度数据集的偏度感兴趣。 理论:

enter image description here

根据matlab,应该翻译成:

enter image description here

在我看来,gsl 专用函数 gsl_stats_skew输出返回了错误的结果。 考虑以下代码

const double array[] = { 2.5,3.7,6.6,9.1,9.5,10.7,11.9,21.5,22.6,25.2 };
const skewness = gsl_stats_skew(array,1,10);
printf("result : %f\n",skewness);
  • 预期结果是 0.5751
  • 返回的结果是 0.41408

我错过了什么?

解决方法

原因是偏度函数的实现方式不同,特别是:

  • biased skewness:它是matlab的默认值和excel的SKEW.P函数,在之前的数据集上等于0.4850
  • 无偏 偏度:matlab 在您添加 flag=0 时计算它,它是 excel 的 SKEW 函数,它是在线计算器计算它的常用方法 => 0.57551
  • gsl 偏度:它是有偏差的版本,有变化:标准偏差是通过使用 1/(N-1) 因子而不是 1/N => 0.41408 来计算的

这是我对 biased 版本的 C 实现,希望对您有所帮助:

double skewness(const double elements[],const int numElements){
  const double media = gsl_stats_mean(elements,1,numElements);
  const double stDev = gsl_stats_sd_with_fixed_mean(elements,numElements,media); // use 1/N normalization factor instead of 1/(N-1)
  double sum_numerator=0;
  for(int i=0; i<numElements; i++) sum_numerator += pow((elements[i] - media),3);
  const double numerator = sum_numerator / numElements;
  const double denominator = pow(stDev,3);
  return numerator / denominator; }