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 => 6;
use constant EPS     => 1e-2;

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

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

# Example from Lakens (2013) pp. 7-8:

my @m1 = ( 9, 7, 8, 9, 8, 9, 9, 10, 9, 9 );
my @m2 = ( 9, 6, 7, 8, 7, 9, 8, 8, 8, 7 );
my @m3 = ( 0, 1, 1, 1, 1, 0, 1, 2, 1, 2);

my %ref_vals = (
    df_b      => 1,
    df_w    => 18,
    #ss_b => 1.49892557715836,
    #ss_w => 4.71271766128144,
    #ms_b => 1.49892557715836,
    #ms_w => 0.0612041254711875,
    f_value => 6.34,
    eta_sq_p => 0.26,
    omega_sq_p => 0.21,
 );

eval { $aov->load_data( { 1 => \@m1, 2 => \@m2 } ); };
ok( !$@, $@ );

my %stats = $aov->anova(independent => 1, parametric => 1, ordinal => 0);

my $es;

#diag("ss_b => $stats{'ss_b'}, ss_w => $stats{'ss_w'}");
$es = $aov_es->eta_sq_partial_by_ss(ss_b => $stats{'ss_b'}, ss_w => $stats{'ss_w'});
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'});
ok( about_equal( $es, $ref_vals{'eta_sq_p'} ),    "eta_sq_partial_by_ss: $es != $ref_vals{'eta_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'});
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'});
ok( about_equal( $es, $ref_vals{'omega_sq_p'} ),    "eta_to_omega: $es != $ref_vals{'omega_sq_p'}" );

# as repeated measures (Lakens, 2013, p. 8)
@m1 = ( 9, 7, 8, 9, 8, 9, 9, 10, 9, 9 );
@m2 = ( 9, 6, 7, 8, 7, 9, 8, 8, 8, 7 );
$aov->load_data( { 1 => \@m1, 2 => \@m2 } );
%stats = $aov->anova(independent => 0, parametric => 1, ordinal => 0);
#diag("f => $stats{'f_value'}, ss_b => $stats{'ss_b'}, ss_w => $stats{'ss_w'}");

%ref_vals = (
    df_b      => 1,
    df_w    => 18,
    f_value => 6.34,
    p_value => 0.022,
    eta_sq_p => 0.26,
    omega_sq_p => 0.21,
 );


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