Ошибка Python: Ошибка значения: Значение истинности ряда неоднозначно. Используйте.empty, a.bool(), a.item(), a.any() или a.all()

#python #jupyter-notebook #linear-regression #statsmodels #p-value

Вопрос:

Имея более 250 независимых переменных, я пытаюсь найти переменные, которые являются статистически значимыми. Для этого я пытаюсь построить цикл for, который будет возвращать только переменные, значение P которых меньше альфа.

 cols = x2.columns
alpha = 0.05
for i in cols:
    if (est2.pvalues[i] < alpha) == True:
        print(i)
 

где est2 = sm.OLS(y,x2).fit() . Это результат, который я получаю:

 LotArea
OverallQual
OverallCond
YearBuilt
YearRemodAdd
BsmtFinSF1
TotalBsmtSF
1stFlrSF
2ndFlrSF
GrLivArea
BsmtFullBath
HalfBath
GarageArea
WoodDeckSF
EnclosedPorch
ScreenPorch
MSZoning_FV
MSZoning_RH
MSZoning_RL
MSZoning_RM
LotConfig_FR2
LotConfig_Inside
LandSlope_Sev
Neighborhood_Crawfor
Neighborhood_Edwards
Neighborhood_MeadowV
Neighborhood_NridgHt
Neighborhood_StoneBr
Condition1_Norm
Condition1_PosN
Condition2_PosN
Condition2_RRAe
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-192-8387e9b8424a> in <module>
      2 alpha = 0.05
      3 for i in cols:
----> 4     if (est2.pvalues[i] < alpha) == True:
      5         print(i)
      6     #print(i, est2.pvalues[i] > alpha)

~anaconda3libsite-packagespandascoregeneric.py in __nonzero__(self)
   1440     @final
   1441     def __nonzero__(self):
-> 1442         raise ValueError(
   1443             f"The truth value of a {type(self).__name__} is ambiguous. "
   1444             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
 

Он останавливается посередине вот так.

Комментарии:

1. Ваши имена столбцов не уникальны, так что в итоге вы получаете вектор вместо одной переменной. Вы должны убедиться, что все имена столбцов различны.

Ответ №1:

Во-первых, == True это лишнее, но это не должно иметь никакого отношения к ошибке.

Ошибка указывает на то, что для одного из имен переменных i (кстати, это немного вводит в заблуждение, так i как обычно в таком цикле это было бы целое число.) выражение est2.pvalues[i] представляет собой ряд панды, а не просто одно значение. Почему именно это происходит, невозможно сказать, не увидев проблемного имени переменной.

В любом случае, est2.pvalues это серия панд, поэтому вы можете получить все низкие значения p (и соответствующие имена переменных) с помощью логической индексации, подобной этой:

 est2.pvalues[est2.pvalues < 0.05]