Hello,

I've been happily doing ANOVAs in Perl::Stats::GLM for well over a year,
but today I encountered a problem: I end up with uninvertible matrices
whenever a between-subjects variable in a mixed ANOVA has 3 or more levels.

I've abstracted the problem down to a toy script:

############################################################################

#!/usr/bin/perl

use 5.018;
use warnings;
use autodie qw(:all);
use PDL::LiteF;
use PDL::Stats;

my ($b,$w) = @ARGV;  # no. of levels of the between and within var,
respectively

my $Nper = 18;  # participants per group

my $N = $Nper*$b;
my @participants   = map "name$_" ,1..$N;
my @between_levels = map "group$_",1..$b;
my @within_levels  = map "cond$_" ,1..$w;

my @data = map {rand(10)} (1..$N*$w);
my $data = pdl(@data);
my $subject = [map {($_) x $w} @participants];
my $between_level =
  [map {($_) x ($Nper*$w)} @between_levels];
my $within_level = [(@within_levels) x $N];

say join("\t",qw/SUB BTWN WTHN DATA/);
foreach my $i (0..$#data) {
    say join("\t",
     $$subject[$i],$$between_level[$i],$$within_level[$i],$data[$i]);
}

my %anova = $data->anova_rptd($subject,
      $between_level,
      $within_level,
      {IVNM=>[qw/group cond/],
       BTWN=>[0],
       PLOT=>0,
      },
     );
foreach (sort keys %anova) {
    say "$_: $anova{$_}" if /F/;  # just to make sure it ran
}

############################################################################

With two groups, everything looks good:

*ejg@memlab2(ejg/PDL_3bet)% *./toyanova 2 2
SUB     BTWN    WTHN    DATA
name1   group1  cond1   2.02211862270818
name1   group1  cond2   0.363244787763222
name2   group1  cond1   1.80069165342626
name2   group1  cond2   5.28708329747083
name3   group1  cond1   6.90248939337
name3   group1  cond2   1.9360941390913
name4   group1  cond1   1.4538515885064
name4   group1  cond2   3.7667718626934
name5   group1  cond1   5.0732797779202
name5   group1  cond2   4.31691074569926
name6   group1  cond1   1.07167669355288
name6   group1  cond2   8.02414718772958
name7   group1  cond1   4.4671776195263
name7   group1  cond2   6.52852693421451
name8   group1  cond1   5.76548373167039
name8   group1  cond2   9.09557689767205
name9   group1  cond1   4.48558986857112
name9   group1  cond2   7.08940320065295
name10  group1  cond1   3.33647699159382
name10  group1  cond2   4.31938089736839
name11  group1  cond1   8.06919295175152
name11  group1  cond2   6.14831582225221
name12  group1  cond1   9.46045068594369
name12  group1  cond2   7.58691065693846
name13  group1  cond1   1.56654287289914
name13  group1  cond2   2.01299651116926
name14  group1  cond1   4.38917638828666
name14  group1  cond2   5.41332006590473
name15  group1  cond1   3.75581372914713
name15  group1  cond2   0.594302421962567
name16  group1  cond1   7.4265173676741
name16  group1  cond2   3.83422912317819
name17  group1  cond1   6.70121800624319
name17  group1  cond2   4.29229371393916
name18  group1  cond1   0.51898434778888
name18  group1  cond2   3.92352134195853
name19  group2  cond1   3.78332345479709
name19  group2  cond2   9.64116136016955
name20  group2  cond1   4.96817945660009
name20  group2  cond2   0.584548524486408
name21  group2  cond1   9.74889767005184
name21  group2  cond2   7.02229561225863
name22  group2  cond1   9.87207006650731
name22  group2  cond2   8.8736831265269
name23  group2  cond1   5.27991082638085
name23  group2  cond2   7.5211810988084
name24  group2  cond1   8.81024497935069
name24  group2  cond2   9.55934941046728
name25  group2  cond1   3.96298747913935
name25  group2  cond2   0.772763580918365
name26  group2  cond1   3.41343511037007
name26  group2  cond2   4.89552060397848
name27  group2  cond1   3.01124806573643
name27  group2  cond2   7.79622153504235
name28  group2  cond1   1.73908259521593
name28  group2  cond2   2.09658096331871
name29  group2  cond1   4.29269783984498
name29  group2  cond2   6.40470860705534
name30  group2  cond1   3.28331920944702
name30  group2  cond2   5.0470596115489
name31  group2  cond1   8.57693358253005
name31  group2  cond2   5.98587620648189
name32  group2  cond1   5.49732027559397
name32  group2  cond2   0.0779379071837383
name33  group2  cond1   1.13002467675191
name33  group2  cond2   8.13835471149758
name34  group2  cond1   2.87583696382523
name34  group2  cond2   3.81015452311836
name35  group2  cond1   9.35231313218839
name35  group2  cond2   9.82763255853783
name36  group2  cond1   5.11223119352135
name36  group2  cond2   6.13097300404966
| cond | F: [0.65682061]
| cond | F_p: [0.42332127]
| group | F: [ 1.7473684]
| group | F_p: [ 0.1950332]
| group ~ cond | F: [0.027304146]
| group ~ cond | F_p: [0.86973393]

But when I kick it up to three groups, it fails, through the
group/condition labels look like they're lined up correctly:

*ejg@memlab2(ejg/PDL_3bet)%* ./toyanova 3 2
SUB     BTWN    WTHN    DATA
name1   group1  cond1   3.50609477683069
name1   group1  cond2   1.68130637469829
name2   group1  cond1   3.05710332739306
name2   group1  cond2   4.55695466694074
name3   group1  cond1   1.03549895237922
name3   group1  cond2   0.396223463903738
name4   group1  cond1   1.99366228558883
name4   group1  cond2   4.0690396753515
name5   group1  cond1   8.44906094009648
name5   group1  cond2   3.41043616703928
name6   group1  cond1   6.95718483084232
name6   group1  cond2   2.49888724637891
name7   group1  cond1   6.8610119333697
name7   group1  cond2   3.30746292218251
name8   group1  cond1   1.87201606182949
name8   group1  cond2   0.111352019886155
name9   group1  cond1   2.39327318006705
name9   group1  cond2   2.52365858875265
name10  group1  cond1   4.70996306574715
name10  group1  cond2   5.43323237056946
name11  group1  cond1   2.64297900788637
name11  group1  cond2   8.50292159059379
name12  group1  cond1   0.607126222818373
name12  group1  cond2   3.85640047472542
name13  group1  cond1   5.6746220814259
name13  group1  cond2   8.44066560092244
name14  group1  cond1   2.78647804960297
name14  group1  cond2   7.56843644563141
name15  group1  cond1   8.51688957460102
name15  group1  cond2   5.26363408105979
name16  group1  cond1   8.1692314397861
name16  group1  cond2   9.94196780478141
name17  group1  cond1   3.47074362220727
name17  group1  cond2   4.49693487402868
name18  group1  cond1   9.63971182957504
name18  group1  cond2   0.302955168036263
name19  group2  cond1   3.19296085241792
name19  group2  cond2   4.46023754481857
name20  group2  cond1   9.59618005360394
name20  group2  cond2   1.85519780162586
name21  group2  cond1   5.02576212280506
name21  group2  cond2   6.22742387640642
name22  group2  cond1   4.01954759132803
name22  group2  cond2   5.14499926788268
name23  group2  cond1   2.69716291108683
name23  group2  cond2   1.55037749946942
name24  group2  cond1   4.20013665828375
name24  group2  cond2   6.8941243595895
name25  group2  cond1   8.89833527322882
name25  group2  cond2   5.71655767913541
name26  group2  cond1   5.38776729629785
name26  group2  cond2   3.30503453989088
name27  group2  cond1   5.71492200076609
name27  group2  cond2   2.46629042908964
name28  group2  cond1   0.911955386748353
name28  group2  cond2   3.4503007868468
name29  group2  cond1   5.09146071126313
name29  group2  cond2   1.68034299689168
name30  group2  cond1   4.22758247631219
name30  group2  cond2   1.40470071289805
name31  group2  cond1   7.86568821569222
name31  group2  cond2   9.75859098945378
name32  group2  cond1   4.37900359027875
name32  group2  cond2   1.07670171476734
name33  group2  cond1   5.12758174918648
name33  group2  cond2   2.29995660929234
name34  group2  cond1   6.57539593946591
name34  group2  cond2   9.86495433363594
name35  group2  cond1   8.22288165211223
name35  group2  cond2   8.87205727538671
name36  group2  cond1   4.99667272804427
name36  group2  cond2   2.330460593815
name37  group3  cond1   5.40010797170599
name37  group3  cond2   7.99217193226468
name38  group3  cond1   0.19819526615759
name38  group3  cond2   2.96788146557198
name39  group3  cond1   1.44255934563478
name39  group3  cond2   4.75147323228171
name40  group3  cond1   6.18076640812202
name40  group3  cond2   4.21789638927628
name41  group3  cond1   7.46254455276418
name41  group3  cond2   4.28050313397108
name42  group3  cond1   9.49818209919339
name42  group3  cond2   7.3307666285951
name43  group3  cond1   7.97547339815669
name43  group3  cond2   7.11035291881487
name44  group3  cond1   3.87740864641184
name44  group3  cond2   6.21967371509889
name45  group3  cond1   1.30900226387414
name45  group3  cond2   0.721961814820702
name46  group3  cond1   2.44694435686466
name46  group3  cond2   8.58764503032752
name47  group3  cond1   3.01101882952072
name47  group3  cond2   8.64263695288699
name48  group3  cond1   6.55906853485302
name48  group3  cond2   1.3368312691221
name49  group3  cond1   4.15493827163917
name49  group3  cond2   0.447836896099432
name50  group3  cond1   5.6346816229053
name50  group3  cond2   4.44270576484378
name51  group3  cond1   2.03789781406119
name51  group3  cond2   4.21721709782432
name52  group3  cond1   8.76975063534896
name52  group3  cond2   6.37380405797977
name53  group3  cond1   7.74455594711331
name53  group3  cond2   6.2929239867492
name54  group3  cond1   2.86569709223539
name54  group3  cond2   5.94155427957823
Uninvertible matrix given to inv: TOO LONG TO PRINT
 at /usr/lib64/perl5/vendor_perl/PDL/Slatec.pm line 327, <DATA> line 90.
        PDL::matinv('PDL=SCALAR(0x3525840)') called at
/usr/local/lib64/perl5/PDL/Stats/GLM.pm line 666
        PDL::ols_t('PDL=SCALAR(0x22b32c0)', 'PDL=SCALAR(0x3524cd0)',
'HASH(0x35257b0)') called at /usr/local/lib64/perl5/PDL/Stats/GLM.pm line
1290
        PDL::anova_rptd('PDL=SCALAR(0x349fb58)', 'ARRAY(0x349fa68)',
'ARRAY(0x22b0748)', 'ARRAY(0x265fd40)') called at ./toyanova line 31

(It gives the same error when the between factor has 4 or more levels,
though I'll spare you the output; the number of within levels doesn't
affect the problem.)

Am I doing something silly (wouldn't surprise me), or is there a problem
with the mixed anova routines?

Thanks for your help,

-Erich
_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to