spb/metrika Public
Stata-class statistics, GPU-accelerated by Apple Silicon. Native Swift — no Electron, no Python runtime, no compromises.
Swift 92.4%
HTML 3.3%
R 3%
Shell 1.3%
1//2// Correlate.swift3// Metrika4//5// Author: Simon-Pierre Boucher6// Contact: contact@spboucher.ai7// Copyright © 2026 Simon-Pierre Boucher. All rights reserved.8//910/// Pearson correlation matrix on listwise-complete data (the engine11/// applies listwise deletion before calling, matching Stata `correlate`).12public enum ZQCorrelate {13 public static func matrix(columns: [[Double]]) -> [[Double]] {14 let k = columns.count15 guard k > 0 else { return [] }16 let n = columns[0].count1718 let means = columns.map { $0.reduce(0, +) / Double(n) }19 var centered = columns20 for j in 0..<k {21 for i in 0..<n { centered[j][i] -= means[j] }22 }23 let norms = centered.map { column in24 column.reduce(0) { $0 + $1 * $1 }.squareRoot()25 }2627 var result = [[Double]](repeating: [Double](repeating: 1, count: k), count: k)28 for a in 0..<k {29 for b in (a + 1)..<k {30 var dot = 0.031 for i in 0..<n { dot += centered[a][i] * centered[b][i] }32 let denominator = norms[a] * norms[b]33 let r = denominator > 0 ? dot / denominator : .nan34 result[a][b] = r35 result[b][a] = r36 }37 }38 return result39 }40}41