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