SPB Git

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.3 KB · 41 lines swift
Raw Blame History
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