c# - Calculo percentil
algorithm math (3)
Agregue los valores a una lista, ordene esa lista y tome el valor de índice ceil (longitud de la lista * percentil).
Quiero imitar la función PERCENTILE equivalente de Excel en C#
(o en algún pseudo código). ¿Cómo puedo hacer eso? La función debe tomar dos argumentos donde el primero es una lista de valores y el segundo para qué percentil debe calcular la función.
Tanques
Edit: Lo siento si mi pregunta llegó como si no la hubiera probado yo misma. Simplemente no podía entender cómo funcionaba la función de Excel (sí, primero probé con wikipedia y wolfram) y pensé que lo entendería mejor si alguien lo presentara en un código. @CodeInChaos dio una respuesta que parece ser lo que estoy buscando.
Creo que la página de Wikipedia tiene fórmulas que necesitas para escribir tu propia función ...
Intenté esto:
public double Percentile(double[] sequence, double excelPercentile)
{
Array.Sort(sequence);
int N = sequence.Length;
double n = (N - 1) * excelPercentile + 1;
// Another method: double n = (N + 1) * excelPercentile;
if (n == 1d) return sequence[0];
else if (n == N) return sequence[N - 1];
else
{
int k = (int)n;
double d = n - k;
return sequence[k - 1] + d * (sequence[k] - sequence[k - 1]);
}
}
EDITADO después del comentario de CodeInChaos:
Excel usa un valor de percentil entre 0 y 1 (así que cambié mi código para implementar esto con las fórmulas de Wikipedia) y el otro método para calcular n (así que cambié el comentado).
Tratando de reproducir los resultados en: http://www.techonthenet.com/excel/formulas/percentile.php me ocurrió:
public static double Percentile(IEnumerable<double> seq,double percentile)
{
var elements=seq.ToArray();
Array.Sort(elements);
double realIndex=percentile*(elements.Length-1);
int index=(int)realIndex;
double frac=realIndex-index;
if(index+1<elements.Length)
return elements[index]*(1-frac)+elements[index+1]*frac;
else
return elements[index];
}
(No maneja NaN
e infinitos).
Algunos casos de prueba:
Percentile(new double[]{1,2,3,4}, 0.8).Dump();// 3.4
Percentile(new double[]{7,8,9,20}, 0.35).Dump();// 8.05
Percentile(new double[]{1,2,3,4}, 0.3).Dump();// 1.9