|
146 | 146 | error ("anova1: GROUP must be a vector with the same number of rows as x."); |
147 | 147 | endif |
148 | 148 |
|
149 | | - ## Identify NaN values (if any) and remove them from X along with |
150 | | - ## their corresponding values from group vector |
151 | | - nonan = ! isnan (x); |
152 | | - x = x(nonan); |
153 | | - group = group(nonan, :); |
154 | | - |
155 | | - ## Convert group to indices and separate names |
| 149 | + ## Convert group to indices and separate names first |
156 | 150 | [group_id, group_names] = grp2idx (group); |
157 | 151 | group_id = group_id(:); |
| 152 | + x = x(:); |
| 153 | + |
| 154 | + ## identify NaN values in x or missing/empty categories in the group and remove them. |
| 155 | + valid_data = !isnan (x) & !isnan (group_id); |
| 156 | + x = x(valid_data); |
| 157 | + group_id = group_id(valid_data); |
158 | 158 | named = 1; |
159 | 159 |
|
160 | 160 | ## Center data to improve accuracy and keep uncentered data for plotting |
|
360 | 360 | %! assert (tbl{2,5}, 15.523192, 1e-6); |
361 | 361 | %! assert (tbl{2,3}, 2, 0); |
362 | 362 | %! assert (tbl{2,4}, 7.5786897, 1e-6); |
| 363 | + |
| 364 | +## testing handling of missing values in both data and grouping variables |
| 365 | +%!test |
| 366 | +%! y = [10; 20; 9999; NaN; 40; 50]; |
| 367 | +%! g = [1; 1; NaN; 1; 2; 2]; |
| 368 | +%! [p, tbl, stats] = anova1 (y, g, "off"); |
| 369 | +%! assert (p, 0.051317, 1e-6); |
| 370 | +%! assert (tbl{2,5}, 18, 1e-6); |
| 371 | +%! assert (tbl{2,3}, 1, 0); |
| 372 | +%! assert (tbl{3,3}, 2, 0); |
| 373 | +%! assert (tbl{4,3}, 3, 0); |
| 374 | +%! assert (stats.n, [2, 2], 0); |
0 commit comments