mantispy.pp.feature_select_chatterjee#
- mantispy.pp.feature_select_chatterjee(adata, by='Metadata_Perturbation', threshold=0.1, m=1, seed=0, min_finite=40, key_added='selected_chatterjee', copy=False)[source]#
Keep features whose values depend on the group, monotonically or otherwise.
- Parameters:
- adata
AnnData Object to select features on.
- by
str(default:'Metadata_Perturbation') obscolumn the features are tested against.- threshold
float(default:0.1) Keep features scoring above this. xi is near zero under independence and approaches one when the feature is a deterministic function of the group, so the threshold is comparable across datasets in a way a correlation cutoff is not.
- m
int(default:1) Right nearest neighbors [Lin and Han, 2022].
m=1is the coefficient of Chatterjee [2020] up to a term of order1/n; larger values lower the noise floor without changing what the statistic converges to.- seed
int(default:0) Seed for breaking ties between rows of the same group.
- min_finite
int(default:40) Fewest finite values a feature may be scored on. A feature measured fewer times than this scores NaN, which is above no threshold and so is never selected.
- key_added
str(default:'selected_chatterjee') Name of the boolean
varcolumn written.- copy
bool(default:False) Return a modified copy instead of mutating in place.
- adata
- Return type:
- Returns:
None, or the modified copy. Writesvar[key_added]and the statistic itself tovar["chatterjee_xi"], which is NaN for a feature that is constant or too sparsely measured to score.- Raises:
ValueError – If
byhas a single group, so that no feature can depend on it.
Notes
Run it after
feature_select(), which drops redundant or unmeasurable features; this keeps the features that carry information about the perturbation. Subset withmt.pp.subset_features(adata, key="selected_chatterjee").A feature is scored on the rows where it was measured, so one that is missing in a whole group is scored against the groups that do have it rather than against the pattern of what is missing.
xi reaches one only for a noiseless function of the group, so real values are much lower and the default threshold of
0.1is permissive. Check the distribution invar["chatterjee_xi"]before relying on a fixed cutoff.With shuffled group labels xi collapses toward zero while the real values barely change, so the score reflects dependence on the group rather than noise.
m=1is the default because the threshold was calibrated there. scmorph usesm=5, and on input free of ties the two implementations agree to 1e-9. scmorph breaks ties inyat random, so on tied input the two differ.