2010-09-02 63 views
7

Tôi có mảng ô, mỗi ô chứa một chuỗi các giá trị dưới dạng vectơ hàng. Trình tự chứa một số giá trị bị thiếu được biểu thị bằng NaN.MATLAB: Sử dụng phép nội suy để thay thế các giá trị bị thiếu (NaN)

Tôi muốn thay thế tất cả các NaN bằng cách sử dụng một số loại phương pháp nội suy, làm thế nào tôi có thể làm điều này trong MATLAB? Tôi cũng mở các đề xuất khác về cách xử lý các giá trị bị thiếu này.

xem xét dữ liệu mẫu này để minh họa cho vấn đề:

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 

Các chuỗi kết quả:

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:

Dựa trên những phản hồi, tôi nghĩ đã có một nhầm lẫn: rõ ràng là tôi không làm việc với dữ liệu ngẫu nhiên, mã được hiển thị ở trên chỉ đơn giản là một ví dụ về cách t dữ liệu của anh ta được cấu trúc.

Dữ liệu thực tế là một số dạng tín hiệu được xử lý. Vấn đề là trong quá trình phân tích, giải pháp của tôi sẽ thất bại nếu chuỗi chứa giá trị thiếu, do đó cần lọc/nội suy (tôi đã xem xét sử dụng giá trị trung bình của mỗi chuỗi để lấp đầy khoảng trống, nhưng tôi hy vọng điều gì đó mạnh hơn)

+1

Trong ví dụ của bạn, tôi nghĩ bạn sẽ khó ép để tìm cách nội suy các giá trị bị thiếu. Nội suy đòi hỏi rằng có một số loại mối quan hệ giữa các điểm dữ liệu. Thường thì điều này có thể là chúng đến từ một chuỗi thời gian (do đó, một dự đoán tốt là phần còn thiếu có thể được suy ra từ các điểm lân cận). Trong dữ liệu mẫu của bạn, bạn đang cố gắng đoán "xu hướng lật" chỉ dựa trên các đồng xu khác. Nếu bạn có thể cung cấp cho chúng tôi thêm thông tin về ví dụ cụ thể của bạn, chúng tôi có thể trợ giúp thêm. – JudoWill

+1

@JudoWill: Tôi nghĩ anh ấy chỉ sử dụng dữ liệu ngẫu nhiên làm ví dụ cho mọi người chơi cùng. – gnovice

Trả lời

8

Vâng, nếu bạn đang làm việc với dữ liệu chuỗi thời gian thì bạn có thể sử dụng chức năng nội suy tích hợp của Matlab.

Điều gì đó như thế này sẽ phù hợp với hoàn cảnh của bạn, nhưng bạn sẽ cần phải điều chỉnh nó một chút ... tức là. nếu bạn không có lấy mẫu khoảng cách bằng nhau, bạn cần phải sửa đổi đường dây 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 

Bạn sẽ cần chơi xung quanh với các tùy chọn interp1 để tìm ra tùy chọn nào phù hợp nhất với tình huống của bạn.

+0

cảm ơn, trong trường hợp của tôi, tôi cần phải thay đổi vector 'times' vì các giá trị được ghi lại trên cơ sở 3 giây – Dave

+0

... Bây giờ tôi đang nghĩ về nó, không quan trọng miễn là các chuỗi được lấy mẫu bằng nhau phải không? – Dave

+0

vâng, miễn là chúng được lấy mẫu ngang nhau, nó không thực sự quan trọng ... nhưng tôi cố gắng càng rõ ràng càng tốt. – JudoWill

0

Như JudoWill nói, bạn cần phải giả định một số loại mối quan hệ giữa dữ liệu của bạn.

Một tùy chọn nhỏ nhặt là tính giá trị trung bình của tổng số chuỗi và sử dụng các dữ liệu đó cho dữ liệu bị thiếu. Một lựa chọn tầm thường khác là lấy giá trị trung bình của n giá trị tiếp theo và n trước đó. Nhưng hãy cẩn thận với điều này: nếu bạn đang thiếu dữ liệu, bạn thường tốt hơn để đối phó với những dữ liệu còn thiếu, hơn là tạo nên một số dữ liệu giả mạo có thể làm hỏng phân tích của bạn.

1

Nếu bạn có quyền truy cập vào Hộp công cụ nhận dạng hệ thống, bạn có thể sử dụng chức năng MISDATA để ước tính giá trị bị thiếu. Theo documentation:

Lệnh này tuyến tính nội suy giá trị còn thiếu để ước lượng mô hình đầu tiên . Sau đó, nó sử dụng mô hình này để ước tính dữ liệu bị thiếu là thông số bằng cách giảm thiểu đầu ra lỗi dự đoán thu được từ dữ liệu được khôi phục .

Về cơ bản thuật toán thay đổi giữa ước tính dữ liệu bị thiếu và mô hình ước tính, theo cách tương tự như thuật toán Tối ưu hóa kỳ vọng (EM).

Mô hình được ước tính có thể là bất kỳ mô hình tuyến tính idmodel (AR/ARX/..) hoặc nếu không được cung cấp, sử dụng mô hình không gian trạng thái mặc định.

Dưới đây là làm thế nào để áp dụng nó vào dữ liệu của bạn:

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

Tôi sẽ sử dụng inpaint_nans, một công cụ được thiết kế để thay thế các yếu tố nan trong 1-d hoặc 2-d ma trận bằng phép nội suy.

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 cảm ơn woodchips – Dave

0

Hãy xem xét ví dụ sau

X = một số mảng Nx1 Y = F (X) với một số Nans trong đó

sau đó sử dụng

X1 = X (tìm (~ isNaN (Y))); Y1 = Y (tìm (~ isnan (Y)));

Bây giờ suy trên X1 và Y1 để tính toán tất cả các giá trị ở tất cả X.

0

Sử dụng griddedInterpolant

Ngoài ra còn một số chức năng khác như interp1. Đối với cốt truyện cong spline là phương pháp tốt nhất để tìm dữ liệu bị thiếu.

Các vấn đề liên quan