MATLAB: Uso de la interpolación para reemplazar los valores faltantes (NAN)
-
26-09-2019 - |
Pregunta
Tengo una matriz de celdas cada una que contiene una secuencia de valores como vector de fila. Las secuencias contienen algunos valores faltantes representados por NaN
.
Me gustaría reemplazar todos los NAN usando algún tipo de método de interpolación, ¿cómo puedo hacer esto en Matlab? También estoy abierto a otras sugerencias sobre cómo lidiar con estos valores faltantes.
Considere estos datos de muestra para ilustrar el problema:
seq = {randn(1,10); randn(1,7); randn(1,8)};
for i=1:numel(seq)
%# simulate some missing values
ind = rand( size(seq{i}) ) < 0.2;
seq{i}(ind) = nan;
end
Las secuencias resultantes:
seq{1}
ans =
-0.50782 -0.32058 NaN -3.0292 -0.45701 1.2424 NaN 0.93373 NaN -0.029006
seq{2}
ans =
0.18245 -1.5651 -0.084539 1.6039 0.098348 0.041374 -0.73417
seq{3}
ans =
NaN NaN 0.42639 -0.37281 -0.23645 2.0237 -2.2584 2.2294
Editar:
Según las respuestas, creo que ha habido una confusión: obviamente no estoy trabajando con datos aleatorios, el código que se muestra arriba es simplemente un ejemplo de cómo se estructuran los datos.
Los datos reales son alguna forma de señales procesadas. El problema es que durante el análisis, mi solución fallaría si las secuencias contienen valores faltantes, de ahí la necesidad de filtrar/interpolación (ya consideré usar la media de cada secuencia para llenar los espacios en blanco, pero espero algo más poderoso)
Solución
Bueno, si está trabajando con datos de la serie temporal, puede usar la función de interpolación integrada de MATLAB.
Algo como esto debería funcionar para su situación, pero deberá adaptarlo un poco ... es decir. Si no tiene un muestreo de igual espacios, deberá modificar el times
línea.
nseq = cell(size(seq))
for i = 1:numel(seq)
times = 1:length(seq{i});
mask = ~isnan(seq{i});
nseq{i} = seq{i};
nseq{i}(~mask) = interp1(times(mask), seq{i}(mask), times(~mask));
end
Tendrás que jugar con las opciones de interp1
Para averiguar cuáles funcionan mejor para su situación.
Otros consejos
yo usaría inPaint_nans, una herramienta diseñada para reemplazar elementos NAN en matrices 1-D o 2-D por interpolación.
seq{1} = [-0.50782 -0.32058 NaN -3.0292 -0.45701 1.2424 NaN 0.93373 NaN -0.029006];
seq{2} = [0.18245 -1.5651 -0.084539 1.6039 0.098348 0.041374 -0.73417];
seq{3} = [NaN NaN 0.42639 -0.37281 -0.23645 2.0237];
for i = 1:3
seq{i} = inpaint_nans(seq{i});
end
seq{:}
ans =
-0.50782 -0.32058 -2.0724 -3.0292 -0.45701 1.2424 1.4528 0.93373 0.44482 -0.029006
ans =
0.18245 -1.5651 -0.084539 1.6039 0.098348 0.041374 -0.73417
ans =
2.0248 1.2256 0.42639 -0.37281 -0.23645 2.0237
Si tiene acceso al Caja de herramientas de identificación del sistema, puedes usar el Misgados función para estimar los valores faltantes. De acuerdo con la documentación:
Este comando interpola linealmente los valores faltantes para estimar el primer modelo. Luego, utiliza este modelo para estimar los datos faltantes como parámetros minimizando los errores de predicción de salida obtenidos de los datos reconstruidos.
Básicamente, el algoritmo alterna entre la estimación de datos faltantes y modelos de estimación, de manera similar al algoritmo de maximización de expectativas (EM).
El modelo estimado puede ser cualquiera de los modelos lineales idmodel
(AR/ARX/..), o si no se da, utiliza un modelo de espacio de estado predeterminado.
Aquí le mostramos cómo aplicarlo a sus datos:
for i=1:numel(seq)
dat = misdata( iddata(seq{i}(:)) );
seq{i} = dat.OutputData;
end
Usar ridiculte
También hay algunas otras funciones como Interp1. Para gráficos curvos, Spline es el mejor método para encontrar datos faltantes.
Como dice Judowill, debe asumir algún tipo de relación entre sus datos.
Una opción trivial sería calcular la media de su serie total y usarlas para los datos faltantes. Otra opción trivial sería tomar la media de los valores anteriores y N siguientes.
Pero tenga mucho cuidado con esto: si le faltan datos, generalmente es mejor lidiar con esos datos faltantes, que inventar algunos datos falsos que podrían arruinar su análisis.
Considere el siguiente ejemplo
X = alguna matriz nx1 y = f (x) con algunos nans en él
Luego usa
X1 = x (encontrar (~ isnan (y))); Y1 = y (encontrar (~ isnan (y)));
Ahora interpolar sobre X1 y Y1 para calcular todos los valores en absoluto X.