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