How to get rid of Nan when calculating mean
753 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
desert_scientist90
il 25 Ott 2019
Risposto: Fabio Freschi
il 25 Ott 2019
Hi I am trying to get rid of the nan's on my mean calculation, if I keep them I wont be able to calculate z-scores. I was using m1=nanmean(x) but when I look at the output I still have the nan's on the column.
Thanks in advance.
2 Commenti
Shubham Gupta
il 25 Ott 2019
Modificato: Shubham Gupta
il 25 Ott 2019
To find indeces with NaN values you can use:
ind = find(isnan(A)); % where A is the array
To delete NaN values from that array you can use:
A(ind) = []; % replacing A(ind) with empty array
I am not sure if that's what you want? But it would be helpful to share some data, so we can understand the problem more clearly and be able to solve
Fabio Freschi
il 25 Ott 2019
Are you saying that the built-in function in failing in the calculation? It seems weird...
Risposta accettata
Robert U
il 25 Ott 2019
Hi Emmanuel Gonzalez-Figueroa,
The function mean() commes with a so-called nanflag: https://de.mathworks.com/help/matlab/ref/mean.html?s_tid=doc_ta#bt5b82t-1-nanflag
Tested with Matlab 2016b:
A = [1 NaN 2 3]; % mean w/o NaN: 2, w/ NaN: NaN
mean(A,'omitnan') % nanmean does nothing else
mean(A) % includenan-flag by default set
mean(A,'includenan') % explicit flag
If you are working with matrices and you want to calculate mean-values column-wise but some columns are full of NaN values there is no way of omitting deletion of said columns (see comment by Shubham Gupta).
If you want to calculate the mean of all matrix entries, use the above command twice.
A = [1 NaN 2 3;
3 NaN 4 5];
mean(mean(A,'omitnan'),'omitnan')
Kind regards,
Robert
0 Commenti
Più risposte (2)
Steven Lord
il 25 Ott 2019
The 'omitnan' option will ignore NaN values in your data when computing the mean. If your data contains values that result in a NaN being computed during the process of computing the mean then you'll receive NaN.
x = [1 NaN 2 3];
meanNoNaN = mean(x, 'omitnan') % No NaN
x2 = [1 NaN Inf -Inf 2 3];
meanNaN = mean(x2, 'omitnan') % Is NaN despite 'omitnan'
The NaN in the second element of x2 is ignored in the mean calculation. So we're taking the mean of five values: 1, Inf, -Inf, 2, and 3. As part of that mean calculation we need to add those five elements together using sum (as is normal for the standard arithmetic mean) and adding Inf and -Inf together results in NaN.
It's a bit subtle, but note that the documentation for the 'omitnan' option in the documentation for the mean function states "Ignore all NaN values in the input." [emphasis added] not "You can never get a NaN from this function if you specify this option." or something to that effect.
If you need to avoid even computed NaN values you probably want to remove non-finite values from your data before computing the mean. Use isfinite to identify those non-finite values or use rmoutliers to eliminate them.
0 Commenti
Fabio Freschi
il 25 Ott 2019
Following Steven Lord answer I would usE
mean(A(isfinite(A)))
0 Commenti
Vedere anche
Categorie
Scopri di più su Logical in Help Center e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!