MATLAB:باستخدام الاستيفاء إلى استبدال القيم المفقودة (نان)

StackOverflow https://stackoverflow.com/questions/3628957

سؤال

لدي مجموعة الخلايا التي تحتوي كل سلسلة من القيم صف ناقلات.تسلسل تحتوي على بعض القيم المفقودة ممثلة NaN.

أود أن استبدال جميع NaNs باستخدام نوع من الاستيفاء طريقة, كيف يمكن أن تفعل هذا في 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

تحرير:

استنادا إلى الردود اعتقد ان هناك التباس:ومن الواضح أنا لا أعمل مع بيانات عشوائية ، رمز هو مبين أعلاه هو مجرد مثال لكيفية البيانات المهيكلة.

البيانات الفعلية هو شكل من أشكال معالجة الإشارات.المشكلة هي أنه خلال تحليل الحل سوف تفشل إذا كان تسلسل تحتوي على القيم المفقودة ، ومن هنا جاءت الحاجة إلى تصفية/الاستيفاء (لقد نظرت بالفعل باستخدام يعني من كل تسلسل لملء الفراغات ، ولكن أنا أتمنى شيئا أكثر قوة)

هل كانت مفيدة؟

المحلول

حسنا ، إذا كنت تعمل مع بيانات السلاسل الزمنية ثم يمكنك استخدام Matlab بنيت في الاستيفاء وظيفة.

شيئا من هذا القبيل يجب أن تعمل من أجل الوضع الخاص بك, ولكن سوف تحتاج إلى تفصيل ذلك قليلا ...ie.إذا لم يكن لديك متساوية متباعدة أخذ العينات سوف تحتاج إلى تعديل 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 لمعرفة تلك التي تعمل بشكل أفضل على الوضع الخاص بك.

نصائح أخرى

وأود أن استخدام 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

إذا كان لديك الوصول إلى نظام تحديد الأدوات, يمكنك استخدام MISDATA وظيفة تقدير القيم المفقودة.وفقا الوثائق:

هذا الأمر خطيا يحرف القيم المفقودة إلى تقدير أولا نموذج.ثم يستخدم هذا النموذج تقدير البيانات المفقودة كما المعلمات عن طريق التقليل من إخراج التنبؤ الأخطاء التي تم الحصول عليها من أعيد بناؤها البيانات.

أساسا الخوارزمية المناوبين بين تقدير البيانات المفقودة وتقدير النماذج بطريقة مشابهة توقع تعظيم (م) الخوارزمية.

النموذج المقدر يمكن أن يكون أي من النماذج الخطية idmodel (AR/ARX/..) ، أو إذا كانت غير معينة ، يستخدم الافتراضي-من أجل الدولة-نموذج الفضاء.

هنا كيفية تطبيقه على البيانات الخاصة بك:

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

استخدام griddedInterpolant

هناك أيضا بعض وظائف أخرى مثل interp1.منحنية المؤامرات المفتاح هو أفضل طريقة للعثور على المفقودين البيانات.

كما JudoWill يقول: يجب أن تفترض نوعا من العلاقة بين البيانات الخاصة بك.

واحدة تافهة الخيار لحساب متوسط إجمالي السلسلة ، واستخدام تلك البيانات المفقودة.آخر تافهة شباب يعني من ن السابق ن المقبلة القيم.

ولكن كن حذرا جدا مع هذه:إذا كنت في عداد المفقودين البيانات ، أنت عموما من الأفضل للتعامل مع تلك البيانات المفقودة ، مما جعل بعض بيانات وهمية التي يمكن أن المسمار التحليل الخاص بك.

النظر في المثال التالي

X=بعض Nx1 مجموعة Y=F(X) مع بعض NaNs في ذلك

ثم استخدام

X1=X(تجد(~isnan(Y)));Y1=Y(تجد(~isnan(Y)));

والآن أقحم على X1 Y1 على حساب كل القيم في كل X.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top