Calculate mean and standard deviation of dispersions within each expression bin. For the Seurat method, this establishes the expected mean-variance relationship by computing statistics within bins of similar expression levels. ## Parameters `log_dispersions` - Log-transformed dispersion values (variance/mean) `bin_indices` - Bin assignment for each gene `n_bins` - Total number of bins ## Return
(
log_dispersions: &[f64],
bin_indices: &[usize],
n_bins: usize,
)
| 291 | /// - Single-gene bins: Mean = gene value, std = NaN (handled by postprocessing) |
| 292 | /// - Uses sample standard deviation (n-1 denominator) |
| 293 | fn calculate_bin_stats( |
| 294 | log_dispersions: &[f64], |
| 295 | bin_indices: &[usize], |
| 296 | n_bins: usize, |
| 297 | ) -> anyhow::Result<(Vec<f64>, Vec<f64>)> { |
| 298 | let mut bin_values: Vec<Vec<f64>> = vec![Vec::new(); n_bins]; |
| 299 | |
| 300 | // Collect values for each bin (excluding NaN) |
| 301 | for (i, &bin_idx) in bin_indices.iter().enumerate() { |
| 302 | let disp = log_dispersions[i]; |
| 303 | if !disp.is_nan() && bin_idx < n_bins { |
| 304 | bin_values[bin_idx].push(disp); |
| 305 | } |
| 306 | } |
| 307 | |
| 308 | let mut bin_means = vec![0.0; n_bins]; |
| 309 | let mut bin_stds = vec![0.0; n_bins]; |
| 310 | |
| 311 | for bin_idx in 0..n_bins { |
| 312 | let values = &bin_values[bin_idx]; |
| 313 | |
| 314 | if values.is_empty() { |
| 315 | bin_means[bin_idx] = f64::NAN; |
| 316 | bin_stds[bin_idx] = f64::NAN; |
| 317 | } else if values.len() == 1 { |
| 318 | // Single gene in bin - Python sets std to NaN |
| 319 | bin_means[bin_idx] = values[0]; |
| 320 | bin_stds[bin_idx] = f64::NAN; |
| 321 | } else { |
| 322 | // Calculate mean |
| 323 | let mean = values.iter().sum::<f64>() / values.len() as f64; |
| 324 | bin_means[bin_idx] = mean; |
| 325 | |
| 326 | // Calculate standard deviation |
| 327 | let variance = |
| 328 | values.iter().map(|&x| (x - mean).powi(2)).sum::<f64>() / (values.len() - 1) as f64; |
| 329 | |
| 330 | bin_stds[bin_idx] = variance.sqrt(); |
| 331 | } |
| 332 | } |
| 333 | |
| 334 | Ok((bin_means, bin_stds)) |
| 335 | } |
| 336 | |
| 337 | /// Normalize dispersions by subtracting expected values and dividing by standard deviation. |
| 338 | /// |
no outgoing calls
no test coverage detected