MATLAB:باستخدام الاستيفاء إلى استبدال القيم المفقودة (نان)
-
26-09-2019 - |
سؤال
لدي مجموعة الخلايا التي تحتوي كل سلسلة من القيم صف ناقلات.تسلسل تحتوي على بعض القيم المفقودة ممثلة 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.