Perl统计:描述性和修剪标准差

Perl统计:描述性和修剪标准差,perl,statistics,Perl,Statistics,Statistics::Descriptive模块提供了Full类,允许您计算修剪平均值。有没有办法从中得到一个标准差?它已经在对数据进行排序以获得修剪后的平均值,因此完成了最难的部分。如果您的数据都是正数或负数,那么您只需保留2个$stat对象,一个用于普通值,一个用于平方值,然后组合修剪后的平均值结果以生成修剪后的标准差: my $stat_x = Statistics::Descriptive::Full->new(); my $stat_xx = Statistics::Descr

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

如果您的数据都是正数或负数,那么您只需保留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
my$stat\u x=Statistics::description::Full->new();
my$stat_xx=统计::描述性::完整->新建();
子加法{
$stat_x->add_data(@x);
$stat_xx->添加数据(映射{$$$$}@);
}
次修剪标准差{
我的$lower=班次;
我的$upper=@?shift:$lower;
我的$trm\u x=$stat\u x->trimmed\u mean($lower,$upper);
我的$trm_xx=$stat_xx->修剪平均值($lower,$upper);
我的$nn=int($stat_x->count()*(1.0-$lower-$upper));

返回($nn@toolic刚刚做了。我知道我可以如何为此编写自己的方法,但似乎没有一个未经证明的方法可以为我编写。或者只是在这里提交代码……然后让其他人将修补程序发送给作者。我会这样做的。这会起作用,但排序现在需要两倍的时间。对于大型数据集来说,这有点不幸,特别是当我们在原始结构中已经有了排序的数据时。@pythonic隐喻我同意,坦率地说,我不使用Statistics::Descriptive。它提供的功能几乎不够有用,同时将您锁定在一个非常受限的界面中。我的解决方案主要是为了提高hack值。如果您需要统计数据的性能,而保持在Perl世界,我建议调查PDL