【问题标题】:Perl Statistics::Descriptive and a trimmed standard deviationPerl Statistics::Descriptive and a trimmed standard deviation
【发布时间】:2011-01-28 05:37:50
【问题描述】:

Statistics::Descriptive 模块提供了Full 类,允许您计算修剪后的平均值。有没有办法从中得到修剪后的标准偏差?它已经对数据进行了排序以获得修剪后的平均值,所以困难的部分已经完成。

【问题讨论】:

  • @toolic 刚刚做了。我知道如何为此编写自己的方法,但看起来没有无证的方法可以为我做。
  • 或者直接在这里提交代码……让别人把补丁发给作者。我会做到的。

标签: perl statistics


【解决方案1】:

如果您的数据全部为正数或全部为负数,那么您可以只保留 2 个 $stat 对象,一个用于纯值,一个用于平方值,并结合 trimmed_mean 结果生成修剪后的 stddev:

my $stat_x = Statistics::Descriptive::Full->new();
my $stat_xx = Statistics::Descriptive::Full->new();
sub add_x {
  $stat_x->add_data( @_ );
  $stat_xx->add_data( map {$_*$_} @_ );
}
sub trimmed_stddev {
  my $lower = shift;
  my $upper = @_ ? shift : $lower;  

  my $trm_x = $stat_x->trimmed_mean( $lower, $upper );
  my $trm_xx = $stat_xx->trimmed_mean( $lower, $upper );

  my $nn = int( $stat_x->count() * ( 1.0 - $lower - $upper ) );

  return ($nn <= 1 ? 0.0 : sqrt(($trm_xx - $trm_x * $trm_x ) * $nn / ($nn -1)) );
}

# add some data 
add_x( 1, 5, 12, 29, 10, 11, 2 );

print trimmed_stddev(0.0);
print trimmed_stddev(0.05);
print trimmed_stddev(0.2);
# output
#    9.45163125250522
#    9.58570364061576
#    4.44222166638871

【讨论】:

  • 这会起作用,但现在排序需要两倍的时间。对于大型数据集来说有点不幸,尤其是。当我们已经拥有原始结构中的排序数据时。
  • @pythonic-metaphor 我同意,坦率地说,我不使用 Statistics::Descriptive。它提供的功能勉强够用,同时将您锁定在一个非常受限的界面中。我的解决方案主要是为了破解价值。如果您在使用 Perl 世界时需要统计性能,我建议您研究 PDL
猜你喜欢
  • 1970-01-01
  • 2022-12-02
  • 2021-11-28
  • 2022-12-01
  • 2017-06-26
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2011-06-13
相关资源
最近更新 更多