@@ -1056,6 +1056,7 @@ sub PDL::anova_rptd {
10561056 # highest ord inter for purely within design, (p-1)*(q-1)*(n-1)
10571057 my $factor = (ref $full[-1] ? $full[-1] : $err_ref->[$full[-1]])->dim(1);
10581058 my $df = $ret{ "$i_pref$e df" } = $factor * $within_df;
1059+ die "${i_pref}residual df = 0" if $df <= 0;
10591060 $ret{ "$i_pref$e ms" } = $ret{ "$i_pref$e ss" } / $df;
10601061 } elsif (ref $full[$k]) { # unique error term
10611062 next EFFECT
@@ -1066,13 +1067,15 @@ sub PDL::anova_rptd {
10661067 = $y->sse(sumover($b_G * $G->transpose)) - $ret{ss_residual};
10671068 if ($k != $#full) {
10681069 my $df = $ret{"$i_pref$e df"} = $full[$k]->dim(1);
1070+ die "residual df = 0" if $df <= 0;
10691071 $ret{"$i_pref$e ms"} = $ss / $df;
10701072 }
10711073 } else { # repeating error term
10721074 my $ss = $ret{$k == $#full ? 'ss_subject' : "$i_pref$e ss"}
10731075 = $ret{"| $idv->[$full[$k]] |$e ss"};
10741076 if ($k != $#full) {
10751077 my $df = $ret{"$i_pref$e df"} = $ret{"| $idv->[$full[$k]] |$e df"};
1078+ die "residual df = 0" if $df <= 0;
10761079 $ret{"$i_pref$e ms"} = $ss / $df;
10771080 }
10781081 }
@@ -1095,6 +1098,7 @@ sub PDL::anova_rptd {
10951098 = $y->sse( sumover($b_G * $G->transpose) ) - $ret{ss_residual};
10961099 my $df0 = $ret{ "| $idv->[$k] | df" } = $ivs_ref->[$k]->dim(1);
10971100 $ret{ "| $idv->[$k] || err df" } = $df1;
1101+ die "residual df = 0" if $df1 <= 0;
10981102 $ret{ "| $idv->[$k] | ms" } = $ret{ "| $idv->[$k] | ss" } / $df0;
10991103 }
11001104 }
0 commit comments