Normalize dispersions by subtracting expected values and dividing by standard deviation. This creates z-scores for dispersion values, allowing identification of genes with unusually high variability relative to genes with similar expression levels. ## Parameters `log_dispersions` - Log-transformed dispersion values `bin_indices` - Bin assignment for each gene `bin_means` - Expected dispersion fo
(
log_dispersions: &[f64],
bin_indices: &[usize],
bin_means: &[f64],
bin_stds: &[f64],
)
| 353 | /// |
| 354 | /// Higher values indicate genes that are more variable than expected. |
| 355 | fn normalize_dispersions( |
| 356 | log_dispersions: &[f64], |
| 357 | bin_indices: &[usize], |
| 358 | bin_means: &[f64], |
| 359 | bin_stds: &[f64], |
| 360 | ) -> anyhow::Result<Vec<f64>> { |
| 361 | let mut normalized_dispersions = vec![0.0; log_dispersions.len()]; |
| 362 | |
| 363 | for (i, &disp) in log_dispersions.iter().enumerate() { |
| 364 | let bin_idx = bin_indices[i]; |
| 365 | |
| 366 | if bin_idx >= bin_means.len() { |
| 367 | normalized_dispersions[i] = f64::NAN; |
| 368 | continue; |
| 369 | } |
| 370 | |
| 371 | let mean = bin_means[bin_idx]; |
| 372 | let std = bin_stds[bin_idx]; |
| 373 | |
| 374 | if disp.is_nan() || mean.is_nan() || std.is_nan() || std == 0.0 { |
| 375 | normalized_dispersions[i] = f64::NAN; |
| 376 | } else { |
| 377 | normalized_dispersions[i] = (disp - mean) / std; |
| 378 | } |
| 379 | } |
| 380 | |
| 381 | Ok(normalized_dispersions) |
| 382 | } |
| 383 | |
| 384 | /// Select highly variable genes based on dispersion scores and expression filters. |
| 385 | /// |
no outgoing calls
no test coverage detected