2010-09-02 3 views
7

У меня есть массив ячеек, каждый из которых содержит последовательность значений в виде вектора строки. Последовательности содержат некоторые недостающие значения, представленные NaN.MATLAB: Использование интерполяции для замены отсутствующих значений (NaN)

Я бы хотел заменить все NaN с помощью своего рода метода интерполяции, как я могу это сделать в MATLAB? Я также открыт для других предложений о том, как справиться с этими недостающими значениями.

Рассмотрим этот пример данных для иллюстрации проблемы:

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 

Полученные последовательности:

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 

Edit:

На основе ответов, я думаю, что там было путаница: очевидно, что я не работаю со случайными данными, приведенный выше код просто является примером того, как t он структурирован.

Фактические данные - это некоторая форма обработанных сигналов. Проблема заключается в том, что во время анализа мое решение потерпело бы неудачу, если последовательности содержат отсутствующие значения, следовательно, необходимость фильтрации/интерполяции (я уже считал, что использую среднее значение каждой последовательности для заполнения пробелов, но я надеюсь на что-то более мощное)

+1

В вашем примере, я думаю, вам будет трудно найти способ интерполировать отсутствующие значения. Интерполяция требует, чтобы между точками данных существовали какие-то отношения. Часто это может случиться так, что они исходят из временного ряда (поэтому можно догадаться, что недостающая часть может быть выведена из соседних точек). В ваших примерах вы пытаетесь угадать «монетку», основанную только на других монетах. Если вы можете дать нам больше информации о вашем конкретном примере, мы можем помочь вам больше. – JudoWill

+1

@JudoWill: Я думаю, что он просто использовал случайные данные в качестве примера для людей, с которыми можно играть. – gnovice

ответ

8

Ну, если вы работаете с данными временного ряда, вы можете использовать встроенную функцию интерполяции Matlab.

Что-то вроде этого должно работать для вашей ситуации, но вам нужно немного приспособить его ... т.е. если у вас нет равных интервалов выборки, вам нужно будет изменить линию 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 

Вы должны будете играть с вариантами interp1, чтобы выяснить, какие из них лучше всего подходит для вашей ситуации.

+0

спасибо, в моем случае мне нужно изменить вектор 'times', так как значения записываются на 3-секундной основе – Dave

+0

... Теперь, когда я думаю об этом, это не имеет значения, если последовательности одинаково выбраны , не так ли? – Dave

+0

Да, если они одинаково выбраны, это не имеет большого значения ... но я стараюсь быть максимально явным. – JudoWill

0

Как говорится в JudoWill, вам необходимо принять какие-то отношения между вашими данными.

Один простой вариант - вычислить среднее значение вашей общей серии и использовать их для отсутствия данных. Другим тривиальным вариантом было бы принять среднее значение n предыдущих и n следующих значений.

Но будьте очень осторожны: если вам не хватает данных, вам лучше справляться с этими недостающими данными, чем составлять некоторые поддельные данные, которые могут испортить ваш анализ.

1

Если у вас есть доступ к System Identification Toolbox, вы можете использовать функцию MISDATA для оценки отсутствующих значений. Согласно documentation:

Эта команда линейно интерполирует пропущенные значения для оценки первой модели. Затем эта модель использует , оценивая недостающие данные как параметры , минимизируя выход ошибки прогнозирования, полученные с восстановленных данных .

В основном алгоритм чередуется между оценкой недостающих данных и оценкой моделей, аналогично алгоритму максимизации ожиданий (EM).

Рассматриваемая модель может быть любой из линейных моделей idmodel (AR/ARX/..), или если она не указана, использует модель состояния состояния по умолчанию.

Вот как применить его к данным:

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

Я хотел бы использовать inpaint_nans, инструмент, предназначенный для замены элементов нан в 1-й или 2-й матрицы путем интерполяции.

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 спасибо древесные щепы – Dave

0

Рассмотрим следующий пример

Х = некоторые Nx1 массив Y = F (X) с некоторой NaNs в нем

затем использовать

X1 = X (найти (~ IsNaN (Y))); Y1 = Y (найти (~ isnan (Y)));

Теперь интерполировать над X1 и Y1, чтобы вычислить все значения на всех X.

0

Использование griddedInterpolant

Там также некоторые другие функции, такие как interp1. Для искривленных графиков сплайн - лучший способ найти отсутствующие данные.

Смежные вопросы