Работа с NAN в scipy.stats.chisquare

#python #numpy #scipy #nan #chi-squared

#python #numpy #scipy #nan #хи-квадрат

Вопрос:

Я пытаюсь выполнить тест 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
  

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

Ответ №1:

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])