Работа с NaNs в scipy.stats.chisquare - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь выполнить тест chi ^ 2 для некоторых данных, которые содержат NaN.Вот MWE:

from scipy.stats import chisquare as chi2
import numpy as np
x = [16, 18, 16, 14, 12, 12]
chi2(x)

выводит

Power_divergenceResult(statistic=2.0, pvalue=0.8491450360846096)

, но

x[-1] = np.nan
chi2(x)

дает

Power_divergenceResult(statistic=nan, pvalue=nan)

Применение маски с

mask = ~np.isnan(x)
chi2(x[mask])

приводит к

TypeError                                 Traceback (most recent call last)
<ipython-input-13-3c009fd66f63> in <module>
----> 1 chi2(x[mask])

TypeError: only integer scalar arrays can be converted to a scalar index

Я думаю (надеюсь), что NaNs в моих фактических данных являются причиной проблемы.Есть ли у scipy.stats.chisquare встроенный способ работы с NaN, как, например, spearmanr с его nan_policy?Если нет, как лучше с ними справиться?

1 Ответ

0 голосов
/ 25 марта 2019

x - список; логический массив (в данном случае любой массив) нельзя использовать для индексации списка.

In [244]: x = [16, 18, 16, 14, 12, 12]                                          
In [245]: x[-1] = np.nan                                                        
In [246]: mask = ~np.isnan(x)                                                   
In [247]: x[mask]                                                               
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-247-fee3ce9a3be1> in <module>
----> 1 x[mask]

TypeError: only integer scalar arrays can be converted to a scalar index
In [248]: mask                                                                  
Out[248]: array([ True,  True,  True,  True,  True, False])

Эта ошибка произошла до вызова chi2.

Теперь, если бы x было ndarray, это могло бы просто сработать :)

In [249]: x = np.array([16, 18, 16, 14, 12, 12])                                
In [250]: x[mask]                                                               
Out[250]: array([16, 18, 16, 14, 12])
...