2010-09-02 23 views
7

Tengo una matriz de celdas que contiene una secuencia de valores como un vector de fila. Las secuencias contienen algunos valores faltantes representados por NaN.MATLAB: Usando la interpolación para reemplazar los valores faltantes (NaN)

Me gustaría reemplazar todos los NaN utilizando 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 perdidos.

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:

Sobre la base de las respuestas, creo que ha habido un confusión: obviamente no estoy trabajando con datos aleatorios, el código que se muestra arriba es simplemente un ejemplo de cómo t él los datos están estructurados.

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 perdidos, de ahí la necesidad de filtrar/interpolar (ya consideré usar la media de cada secuencia para llenar los espacios en blanco, pero espero algo más poderoso)

+1

En su ejemplo, creo que sería difícil encontrar una forma de interpolar los valores perdidos. La interpolación requiere que haya algún tipo de relación entre los puntos de datos. A menudo, esto puede deberse a que provienen de una serie temporal (por lo que una buena suposición es que la parte faltante puede inferirse de los puntos cercanos). En los datos de ejemplo, intentas adivinar un "cambio de moneda" basado únicamente en otros cambios de moneda. Si puede darnos más información sobre su ejemplo específico, podemos ayudarlo más. – JudoWill

+1

@JudoWill: Creo que solo estaba usando datos aleatorios como un ejemplo para las personas con las que jugar. – gnovice

Respuesta

8

Bueno, si está trabajando con datos de series temporales, puede usar la función de interpolación incorporada de Matlab.

Algo así debería funcionar para su situación, pero tendrá que adaptarlo un poco ... es decir. si no tiene muestras espaciadas iguales, deberá modificar la línea times.

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á que jugar un poco con las opciones de interp1 de averiguar cuáles funcionan mejor para su situación.

+0

gracias, en mi caso necesito cambiar el vector 'times' ya que los valores se registran en 3 segundos – Dave

+0

... Ahora que estoy pensando en eso, no importa mientras las secuencias sean igualmente muestreadas ¿No es así? – Dave

+0

Sí, siempre que se muestreen de la misma manera, no importa ... pero trato de ser lo más explícito posible. – JudoWill

0

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 usarla para datos faltantes. Otra opción trivial sería tomar la media de los valores n anterior y n siguiente.

Pero tenga mucho cuidado con esto: si le faltan datos, generalmente es mejor tratar con esos datos faltantes, que inventar algunos datos falsos que podrían arruinar su análisis.

1

Si tiene acceso a la Caja de herramientas de identificación del sistema, puede usar la función MISDATA para estimar los valores perdidos. De acuerdo con la documentation:

Este comando interpola linealmente valores que faltan para estimar el primer modelo . Luego, utiliza este modelo para estimar los datos faltantes como parámetros al minimizar los errores de predicción de salida obtenidos de los datos reconstruidos .

Básicamente, el algoritmo alterna entre estimar datos faltantes y estimar modelos, de forma 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 proporciona, utiliza un modelo de espacio de estado de orden predeterminada.

Aquí es cómo aplicarla a sus datos:

for i=1:numel(seq) 
    dat = misdata(iddata(seq{i}(:))); 
    seq{i} = dat.OutputData; 
end 
6

me gustaría utilizar inpaint_nans, una herramienta diseñada para reemplazar elementos nan en 1-D o 2-d matrices 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 
+1

+1 gracias astillas de madera – Dave

0

Consideremos el siguiente ejemplo

X = alguna matriz Nx1 Y = F (X) con un poco de NaNs en ella

a continuación, utilizar

X1 = X (Encontrar (~ isnan (Y))); Y1 = Y (encontrar (~ isnan (Y)));

Ahora interpolar sobre X1 e Y1 para calcular todos los valores en absoluto X.

0

Uso griddedInterpolant

Hay

también algunas otras funciones como interp1. Para diagramas curvos spline es el mejor método para encontrar datos faltantes.

Cuestiones relacionadas