Perl Statistics::Descriptive 和修剪后的标准差

3
< p > Statistics::Descriptive 模块提供了 Full 类,可以计算修剪平均值。 是否有办法从中获得修剪标准差? 它已经对数据进行排序以获得修剪平均值,因此难点已经解决。


@toolic 刚刚完成了。我知道我可以为此编写自己的方法,但似乎没有未记录的方法可以为我完成它。 - pythonic metaphor
或者在这里提交代码...让其他人将补丁发送给作者。我本来可以做的。 - Erik Aronesty
1个回答

3

如果你的数据都是正数或负数,那么你只需要保留 2 个 $stat 对象,一个记录原始值,一个记录平方值,并将修剪后的均值结果结合起来生成修剪标准差:

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

1
这个方法可以行得通,但排序现在需要两倍的时间。对于大数据集来说有点不幸,特别是当我们已经在原始结构中拥有排序好的数据时。 - pythonic metaphor
@pythonic-metaphor 我同意,坦率地说,我不使用Statistics::Descriptive。它提供的功能仅足以有用,同时将您锁定在非常受限制的接口中。我的解决方案主要是为了破解价值。如果您需要在Perl世界中保持性能并进行统计分析,我建议您研究PDL。 - ivancho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接