84 lines
2.7 KiB
Python
84 lines
2.7 KiB
Python
"""
|
||
Created on Mar 30, 2022 1:21:54 PM
|
||
|
||
Author: Josef Perktold
|
||
License: BSD-3
|
||
"""
|
||
|
||
import numpy as np
|
||
from numpy.testing import assert_allclose
|
||
|
||
|
||
def _mover_confint(stat1, stat2, ci1, ci2, contrast="diff"):
|
||
"""
|
||
|
||
References
|
||
----------
|
||
|
||
.. [#] Krishnamoorthy, K., Jie Peng, and Dan Zhang. 2016. “Modified Large
|
||
Sample Confidence Intervals for Poisson Distributions: Ratio, Weighted
|
||
Average, and Product of Means.” Communications in Statistics - Theory
|
||
and Methods 45 (1): 83–97. https://doi.org/10.1080/03610926.2013.821486.
|
||
|
||
|
||
.. [#] Li, Yanhong, John J. Koval, Allan Donner, and G. Y. Zou. 2010.
|
||
“Interval Estimation for the Area under the Receiver Operating
|
||
Characteristic Curve When Data Are Subject to Error.” Statistics in
|
||
Medicine 29 (24): 2521–31. https://doi.org/10.1002/sim.4015.
|
||
|
||
.. [#] Zou, G. Y., and A. Donner. 2008. “Construction of Confidence Limits
|
||
about Effect Measures: A General Approach.” Statistics in Medicine 27
|
||
(10): 1693–1702. https://doi.org/10.1002/sim.3095.
|
||
"""
|
||
|
||
if contrast == "diff":
|
||
stat = stat1 - stat2
|
||
low_half = np.sqrt((stat1 - ci1[0])**2 + (stat2 - ci2[1])**2)
|
||
upp_half = np.sqrt((stat1 - ci1[1])**2 + (stat2 - ci2[0])**2)
|
||
ci = (stat - low_half, stat + upp_half)
|
||
|
||
elif contrast == "sum":
|
||
stat = stat1 + stat2
|
||
low_half = np.sqrt((stat1 - ci1[0])**2 + (stat2 - ci2[0])**2)
|
||
upp_half = np.sqrt((stat1 - ci1[1])**2 + (stat2 - ci2[1])**2)
|
||
ci = (stat - low_half, stat + upp_half)
|
||
|
||
elif contrast == "ratio":
|
||
# stat = stat1 / stat2
|
||
prod = stat1 * stat2
|
||
term1 = stat2**2 - (ci2[1] - stat2)**2
|
||
term2 = stat2**2 - (ci2[0] - stat2)**2
|
||
low_ = (prod -
|
||
np.sqrt(prod**2 - term1 * (stat1**2 - (ci1[0] - stat1)**2))
|
||
) / term1
|
||
upp_ = (prod +
|
||
np.sqrt(prod**2 - term2 * (stat1**2 - (ci1[1] - stat1)**2))
|
||
) / term2
|
||
|
||
# method 2 Li, Tang, Wong 2014
|
||
low1, upp1 = ci1
|
||
low2, upp2 = ci2
|
||
term1 = upp2 * (2 * stat2 - upp2)
|
||
term2 = low2 * (2 * stat2 - low2)
|
||
low = (prod -
|
||
np.sqrt(prod**2 - term1 * low1 * (2 * stat1 - low1))
|
||
) / term1
|
||
upp = (prod +
|
||
np.sqrt(prod**2 - term2 * upp1 * (2 * stat1 - upp1))
|
||
) / term2
|
||
|
||
assert_allclose((low_, upp_), (low, upp), atol=1e-15, rtol=1e-10)
|
||
|
||
ci = (low, upp)
|
||
|
||
return ci
|
||
|
||
|
||
def _mover_confint_sum(stat, ci):
|
||
|
||
stat_ = stat.sum(0)
|
||
low_half = np.sqrt(np.sum((stat_ - ci[0])**2))
|
||
upp_half = np.sqrt(np.sum((stat_ - ci[1])**2))
|
||
ci = (stat - low_half, stat + upp_half)
|
||
return ci
|