The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Tests of eta_squared methods

use strict;
use warnings;
use Test::More tests => 8;
use constant EPS     => 1e-4;

BEGIN { use_ok('Statistics::ANOVA::EffectSize') }

my $aov_es = Statistics::ANOVA::EffectSize->new();

# SPSS output:

my @c1 = ( 9, 6, 9 );
my @c2 = ( 4, 5, 1 );
my @c3 = ( 1, 2, 2 );

my %ref_vals = (
    df_b      => 1,
    df_w    => 77,
    ss_b => 1.49892557715836,
    ss_w => 4.71271766128144,
    ms_b => 1.49892557715836,
    ms_w => 0.0612041254711875,
    f_value => 24.4905970899624,
    eta_sq_p => 0.241309025586417,
    omega_sq_p => 0.231455896,
    count => 78,
);

#eval { $aov_es->load_data( { 1 => \@c1, 2 => \@c2, 3 => \@c3, 4 => \@c4 } ); };
#ok( !$@, $@ );

my $es;

## ... and no given data:
#eval { $h_value = $aov_es->h_value(); };
#ok( !$@, $@ );

$es = $aov_es->eta_sq_partial_by_ss(ss_b => $ref_vals{'ss_b'}, ss_w => $ref_vals{'ss_w'});
#diag("eta = $es");
ok( about_equal( $es, $ref_vals{'eta_sq_p'} ),
    "eta_sq_partial_by_ss: $es != $ref_vals{'eta_sq_p'}" );

$es = $aov_es->eta_sq_partial_by_f(f_value => $ref_vals{'f_value'} , df_b => $ref_vals{'df_b'}, df_w => $ref_vals{'df_w'});
#diag("eta = $es");
ok( about_equal( $es, $ref_vals{'eta_sq_p'} ),
    "eta_sq_partial_by_ss: $es != $ref_vals{'eta_sq_p'}" );

# check that the two omega-sq methods yield the same results:
my $numerator_ss = Statistics::ANOVA::EffectSize::_omega_numerator_ss({df_b => $ref_vals{'df_b'},
df_w => $ref_vals{'df_w'},
ss_b => $ref_vals{'ss_b'},
ss_w => $ref_vals{'ss_w'}});
#diag($numerator_ss);

my $numerator_ms = Statistics::ANOVA::EffectSize::_omega_numerator_ms({ms_b => $ref_vals{'ms_b'}, ms_w => $ref_vals{'ms_w'}, df_b => $ref_vals{'df_b'}, count => $ref_vals{'count'}});
#diag($numerator_ms);

ok( about_equal( $numerator_ss, $numerator_ms ),
    "omega_sq_partial_xx methods: numerators do not agree: $numerator_ss != $numerator_ms" );

my $denominator_ss = Statistics::ANOVA::EffectSize::_omega_denominator_ss({df_b => $ref_vals{'df_b'},
df_w => $ref_vals{'df_w'},
ss_b => $ref_vals{'ss_b'},
ss_w => $ref_vals{'ss_w'},
count => $ref_vals{'count'}});
#diag($numerator_ss);

my $denominator_ms = Statistics::ANOVA::EffectSize::_omega_denominator_ms({ms_b => $ref_vals{'ms_b'}, ms_w => $ref_vals{'ms_w'}, df_b => $ref_vals{'df_b'}, count => $ref_vals{'count'}});
#diag($numerator_ms);

ok( about_equal( $denominator_ss, $denominator_ms ),
    "omega_sq_partial_xx methods: denominators do not agree: $denominator_ss != $denominator_ms" );

# $es->omega_sq_partial_by_ss(df_b => NUM, df_w => NUM, ss_b => NUM, ss_w => NUM);
$es = $aov_es->omega_sq_partial_by_ss(
df_b => $ref_vals{'df_b'},
df_w => $ref_vals{'df_w'},
ss_b => $ref_vals{'ss_b'},
ss_w => $ref_vals{'ss_w'},
count => $ref_vals{'count'},
 );
#diag("omega = $es");
ok( about_equal( $es, $ref_vals{'omega_sq_p'} ),
    "omega_sq_partial_by_ss: $es != $ref_vals{'omega_sq_p'}" );
 
$es = $aov_es->omega_sq_partial_by_ms(ms_b => $ref_vals{'ms_b'}, ms_w => $ref_vals{'ms_w'}, df_b => $ref_vals{'df_b'}, count => $ref_vals{'count'});
#diag("omega = $es");
ok( about_equal( $es, $ref_vals{'omega_sq_p'} ),
    "omega_sq_partial_by_ms: $es != $ref_vals{'omega_sq_p'}" );
    
#$es = $aov_es->omega_sq_partial_by_f(f_value => $ref_vals{'f_value'} , df_b => $ref_vals{'df_b'}, df_w => $ref_vals{'df_w'});
#diag("omega = $es");
#ok( about_equal( $es, $ref_vals{'omega_sq_p'} ),
#    "omega_sq_partial_by_f: $es != $ref_vals{'omega_sq_p'}" );
    
$es = $aov_es->eta_to_omega(df_b => $ref_vals{'df_b'}, df_w => $ref_vals{'df_w'}, eta_sq => $ref_vals{'eta_sq_p'});
#diag("eta-2-omega = $es");
ok( about_equal( $es, $ref_vals{'omega_sq_p'} ),
    "eta_to_omega: $es != $ref_vals{'omega_sq_p'}" );

sub about_equal {
    return 0 if !defined $_[0] || !defined $_[1];
    return 1 if $_[0] + EPS > $_[1] and $_[0] - EPS < $_[1];
    return 0;
}
1;