function grubbs(tablas_resultados) {

    let camposAtipicos = [];
    let factor_grubbs = {
        3: 1.155, 4: 1.496, 5: 1.764, 6: 1.973, 7: 2.139, 8: 2.274, 9: 2.387, 10: 2.482, 11: 2.564,
        12: 2.636, 13: 2.699, 14: 2.755, 15: 2.806, 16: 2.852, 17: 2.894, 18: 2.932, 19: 2.968, 20: 3.001,
        21: 3.031, 22: 3.06, 23: 3.087, 24: 3.112, 25: 3.135, 26: 3.158, 27: 3.179, 28: 3.199, 29: 3.218,
        30: 3.236, 31: 3.253, 32: 3.27, 33: 3.286, 34: 3.301, 35: 3.316, 36: 3.33, 37: 3.343, 38: 3.356,
        39: 3.369, 40: 3.381, 41: 3.392, 42: 3.404, 43: 3.415, 44: 3.425, 45: 3.435, 46: 3.445, 47: 3.455,
        48: 3.464, 49: 3.474, 50: 3.482, 51: 3.491, 52: 3.5, 53: 3.508, 54: 3.516, 55: 3.524, 56: 3.531,
        57: 3.539, 58: 3.546, 59: 3.553, 60: 3.56, 61: 3.567, 62: 3.573, 63: 3.58, 64: 3.586, 65: 3.592,
        66: 3.598, 67: 3.604, 68: 3.61, 69: 3.616, 70: 3.622, 71: 3.627, 72: 3.633, 73: 3.638, 74: 3.643,
        75: 3.648, 76: 3.653, 77: 3.658, 78: 3.663, 79: 3.668, 80: 3.673, 81: 3.678, 82: 3.682, 83: 3.687,
        84: 3.691, 85: 3.695, 86: 3.7, 87: 3.704, 88: 3.708, 89: 3.712, 90: 3.716, 91: 3.72, 92: 3.724,
        93: 3.728, 94: 3.732, 95: 3.736, 96: 3.74, 97: 3.743, 98: 3.747, 99: 3.75, 100: 3.754
    };

    const limite_inf = [];
    const limite_sup = [];
    const de = [];
    const n = [];
    const f_grubbs = [];
    const media = []

    for (let i = 0; i < tablas_resultados.length; i++) { // Por cada tabla se realiza un bucle
        let tablaAct = tablas_resultados.eq(i);
        let corridas = tablaAct.find("tr");
        let num_corridas_full = 5;

        for (let ic = 0; ic < corridas.length; ic++) {
            let corridaAct = corridas.eq(ic);
            let concentracion_1 = corridaAct.find(".concentracion_1").val();
            let concentracion_2 = corridaAct.find(".concentracion_2").val();
            let concentracion_3 = corridaAct.find(".concentracion_3").val();
            let concentracion_4 = corridaAct.find(".concentracion_4").val();
            let concentracion_5 = corridaAct.find(".concentracion_5").val();
            if (
                (concentracion_1 == "" || parseFloat(concentracion_1) == 0) &&
                (concentracion_2 == "" || parseFloat(concentracion_2) == 0) &&
                (concentracion_3 == "" || parseFloat(concentracion_3) == 0) &&
                (concentracion_4 == "" || parseFloat(concentracion_4) == 0) &&
                (concentracion_5 == "" || parseFloat(concentracion_5) == 0)
            ) { // Si hay una corrida nula
                // num_corridas_full--;
            }
        }

        if (num_corridas_full == 5) {
            let resultados_nivel = [];
            for (ic = 0; ic < corridas.length; ic++) {
                corridaAct = corridas.eq(ic);
                for (cont = 1; cont <= 5; cont++) {
                    if (
                        corridaAct.find(".concentracion_" + cont).val() != "" &&
                        parseFloat(corridaAct.find(".concentracion_" + cont).val()) != 0
                    ) {
                        resultados_nivel.push(corridaAct.find(".concentracion_" + cont));
                    }
                }
            }

            let concentraciones = [];
            for (oc = 0; oc < resultados_nivel.length; oc++) {
                concentraciones.push(parseFloat(resultados_nivel[oc].val()));
            }

            media.push(media_grubbs(concentraciones));
            de.push(de_grubbs(concentraciones));
            n.push(resultados_nivel.length);
            f_grubbs.push(factor_grubbs[n[i]]);
            limite_inf.push(media[i] - (f_grubbs[i] * de[i]));
            limite_sup.push(media[i] + (f_grubbs[i] * de[i]));
            console.log("la media es: " + media);
            console.log("la D.E. es: " + de);
            console.log("El valor N es: " + n[i]);
            console.log("El factor de Grubbs es: " + f_grubbs[i]);
            console.log("El limite inferior es: " + limite_inf);
            console.log("El limite superior es: " + limite_sup);
            camposAtipicos.push([])

            for (let it = 0; it < resultados_nivel.length; it++) {
                concentracion = parseFloat(resultados_nivel[it].val());

                if (concentracion < limite_inf[i] || concentracion > limite_sup[i]) {
                    camposAtipicos[i].push(resultados_nivel[it]);
                }
            }
        }
    }
    for (let index = 0; index < camposAtipicos.length; index++) {
        const camposArr = camposAtipicos[index];

        if (camposArr.length > 0) {
            return { camposAtipicos, limite_inf, limite_sup, f_grubbs, de, n, media };
        }
    }


    return false;


    function media_grubbs(concentraciones) {
        if (concentraciones.length == 0) {
            return 0;
        } else {
            return suma_grubbs(concentraciones) / concentraciones.length;
        }
    }

    function suma_grubbs(concentraciones) {
        let suma = 0;
        concentraciones.forEach(function (numero) {
            suma += numero;
        });
        return suma;
    }

    function de_grubbs(concentraciones) {
        let n = concentraciones.length;
        if (n === 0) {
            return 0;
        }

        if (n === 1) {
            return 0;
        }

        let mean = suma_grubbs(concentraciones) / n;
        let carry = 0.0;
        let d;

        concentraciones.forEach(function (val) {
            d = val - mean;
            carry += d * d;
        });

        return Math.sqrt(carry / (n - 1));
    }
}
