¿Cómo acelerar un bucle "para" utilizado en la detección de valores atípicos?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Uso el siguiente bucle "para" para detectar y eliminar valores atípicos de un conjunto de datos. Importe la columna como una matriz (mBase) porque esto resolvió otros problemas y luego la ejecuté a través del bucle. ¿Alguien tiene alguna recomendación para acelerar esto? Actualmente, los registros de 2000 tardan de 3 a 4 segundos y estoy tratando con 60,000 registros.
Para (i = 1, i <2000 + 1, i ++,
Si(
mBase > Quantile (0.75, mBase) + 3.95 * (Quantile (0.75, mBase) -
Cuantil (0,25, mBase)) | mBase
Quantile (0.75, mBase) - Quantile (0.25, mBase),
mBase = [.]
)
);
Gracias de antemano por la respuesta (s).
Mate
Re: ¿Cómo acelerar un bucle "para" usado en la detección de valores atípicos?Aún más rápido: opere en toda la matriz a la vez y evite el bucle por completo.
mBase = mBase: / ((q25 - 3.95 * (q75 - q25)) <= mBase <= (q75 + 3.95 * (q75 - q25)));
: / es la división de matriz de elementos. Por ejemplo, [10 21]: / [5 3] == [2 7]
El código anterior aprovecha el hecho de que dividir entre 0 produce un valor perdido. Un enfoque más general y ligeramente más lento es usar la función Loc ().
locs = Loc (! ((q25 - 3.95 * (q75 - q25)) <= mBase <= (q75 + 3.95 * (q75 - q25))));
mBase [locs] =.;
Re: ¿Cómo acelerar un bucle "para" usado en la detección de valores atípicos?Esto ha mejorado mucho. Gracias por la ayuda.
Re: ¿Cómo acelerar un bucle "para" usado en la detección de valores atípicos?Esto debería ser mucho más rápido:
q75 = cuantil (.75, mBase);
q25 = cuantil (.25, mBase);
Para (i = 1, i <2000 + 1, i ++,
Si (mBase > q75 + 3.95 * (q75 - q25) |
mBase
mBase = [.]
)
);