mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
50 lines
1.8 KiB
Swift
50 lines
1.8 KiB
Swift
//===--- Statistics.swift -------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// For a given p-value, returns the critical chi-square value for
|
|
/// a distribution with 1 degree of freedom.
|
|
func _chiSquaredUniform1DFCritical(_ pValue: Double) -> Double {
|
|
if abs(pValue - 0.05) < 0.00001 { return 0.00393214 }
|
|
if abs(pValue - 0.02) < 0.00001 { return 0.000628450 }
|
|
if abs(pValue - 0.01) < 0.00001 { return 0.000157088 }
|
|
if abs(pValue - 0.007) < 0.00001 { return 0.000076971 }
|
|
if abs(pValue - 0.005) < 0.00001 { return 0.0000392704 }
|
|
if abs(pValue - 0.003) < 0.00001 { return 0.0000141372 }
|
|
if abs(pValue - 0.002) < 0.00001 { return 6.2832e-6 }
|
|
if abs(pValue - 0.001) < 0.00001 { return 1.5708e-6 }
|
|
fatalError("unknown value")
|
|
}
|
|
|
|
/// Perform chi-squared test for a discrete uniform distribution with
|
|
/// 2 outcomes.
|
|
public func chiSquaredUniform2(
|
|
_ trials: Int, _ observedACount: Int, _ pValue: Double
|
|
) -> Bool {
|
|
|
|
func square(_ x: Double) -> Double {
|
|
return x * x
|
|
}
|
|
|
|
let expectedA = 0.5
|
|
let expectedB = 0.5
|
|
let observedA = Double(observedACount) / Double(trials)
|
|
let observedB = 1.0 - observedA
|
|
let chiSq =
|
|
square(observedA - expectedA) / expectedA +
|
|
square(observedB - expectedB) / expectedB
|
|
if chiSq > _chiSquaredUniform1DFCritical(pValue) {
|
|
print("chi-squared test failed: \(trials) \(observedACount) \(chiSq)")
|
|
return false
|
|
}
|
|
return true
|
|
}
|