Wilson分数间隔的Objective-C实现

时间:2009-11-06 13:07:11

标签: objective-c statistics

我正在寻找一个Objective-c库或者只是可以处理计算Wilson Score Interval的函数:

http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

供参考,这是来自同一来源的Ruby实现:

require 'statistics2'

def ci_lower_bound(pos, n, power)
    if n == 0
        return 0
    end
    z = Statistics2.pnormaldist(1-power/2)
    phat = 1.0*pos/n
    (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
end

1 个答案:

答案 0 :(得分:1)

假设列出的{em> pnormaldist <{3}}的实现是正确的(我已逐字复制):

double pnormaldist(double qn)
{
    double b[] = {1.570796288, 0.03706987906, -0.8364353589e-3, -0.2250947176e-3, 0.6841218299e-5, 0.5824238515e-5, -0.104527497e-5, 0.8360937017e-7, -0.3231081277e-8, 0.3657763036e-10, 0.6936233982e-12};

    if(qn < 0.0 || 1.0 < qn)
        return 0.0;

    if(qn == 0.5)
        return 0.0;

    double w1 = qn;
    if(qn > 0.5)
        w1 = 1.0 - w1;
    double w3 = -log(4.0 * w1 * (1.0 - w1));
    w1 = b[0];
    int i=1;
    for(;i<11;i++)
        w1 += b[i] * pow(w3,i);

    if(qn > 0.5)
        return sqrt(w1*w3);
    return -sqrt(w1*w3);
}

double ci_lower_bound(int pos, int n, double power)
{
    if(n==0)
        return 0.0;
    double z = pnormaldist(1-power/2);
    double phat = 1.0*pos/n;
    return (phat + z*z/(2*n) - z * sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n);
}