MCPcopy Index your code
hub / github.com/SingleRust/SingleRust / calculate_bin_stats

Function calculate_bin_stats

src/memory/processing/hvg/mod.rs:293–335  ·  view source on GitHub ↗

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,
)

Source from the content-addressed store, hash-verified

291/// - Single-gene bins: Mean = gene value, std = NaN (handled by postprocessing)
292/// - Uses sample standard deviation (n-1 denominator)
293fn 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///

Callers 1

compute_seurat_hvgFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected