2009-11-06 6 views
0

Je suis à la recherche d'une bibliothèque c objectif ou seulement les fonctions qui peuvent gérer le calcul du Wilson Score Intervalle expliqué ici:mise en œuvre Objective-C du Wilson Score Intervalle

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

Pour référence, voici une implémentation Ruby de la même source:

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 

Répondre

1

en supposant la mise en œuvre pour pnormaldist énumérés here est correcte (je l'ai copié mot à mot):

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); 
}