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)

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top