Jak znaleźć wartość p (istotność) każdego współczynnika?
lm = sklearn.linear_model.LinearRegression()
lm.fit(x,y)
python
numpy
statistics
scikit-learn
regression
elplatt
źródło
źródło
Odpowiedzi:
To trochę przesada, ale dajmy sobie szansę. Najpierw użyjmy statsmodel, aby dowiedzieć się, jakie powinny być wartości p
i otrzymujemy
Ok, odtwórzmy to. To trochę przesada, ponieważ prawie odtwarzamy analizę regresji liniowej za pomocą algebry macierzy. Ale co do cholery.
I to nam daje.
Więc możemy odtworzyć wartości ze statsmodel.
źródło
code
np.linalg.inv może czasami zwracać wynik, nawet jeśli macierz jest nieodwracalna. To może być problem.nan
s. Dla mnie to dlatego, że mojeX
były próbką moich danych, więc indeks był wyłączony. Powoduje to błędy podczas dzwonieniapd.DataFrame.join()
.newX = pd.DataFrame({"Constant":np.ones(len(X))}).join(pd.DataFrame(X.reset_index(drop=True)))
Regresja liniowa scikit-learn nie oblicza tych informacji, ale możesz łatwo rozszerzyć klasę, aby to zrobić:
Skradziony stąd .
Powinieneś przyjrzeć się modelom statystyk dla tego rodzaju analizy statystycznej w Pythonie.
źródło
EDYCJA: Prawdopodobnie nie jest to właściwy sposób, patrz komentarze
Możesz użyć sklearn.feature_selection.f_regression.
kliknij tutaj, aby przejść na stronę scikit-Learn
źródło
Kod w odpowiedzi elyase https://stackoverflow.com/a/27928411/4240413 w rzeczywistości nie działa. Zauważ, że sse jest skalarem, a następnie próbuje go iterować. Poniższy kod to zmodyfikowana wersja. Nie jest zadziwiająco czysty, ale myślę, że działa mniej więcej.
źródło
Łatwym sposobem na pobranie wartości p jest użycie regresji modeli statycznych:
Otrzymujesz serię wartości p, którymi możesz manipulować (na przykład wybierz kolejność, którą chcesz zachować, oceniając każdą wartość p):
źródło
p_value należy do statystyk f. jeśli chcesz uzyskać wartość, po prostu użyj tych kilku wierszy kodu:
źródło
W odpowiedzi @JARH może być błąd w przypadku regresji wielowymiarowej. (Nie mam wystarczającej reputacji, aby komentować).
W następującym wierszu:
p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-1))) for i in ts_b]
,wartości t są zgodne z rozkładem stopni chi kwadrat
len(newX)-1
zamiast rozkładu stopni chi kwadratlen(newX)-len(newX.columns)-1
.Więc to powinno być:
p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-len(newX.columns)-1))) for i in ts_b]
(Aby uzyskać więcej informacji, patrz wartości t dla regresji OLS )
źródło
Możesz użyć scipy dla wartości p. Ten kod pochodzi z dokumentacji Scipy.
źródło
W przypadku jednowierszowego można użyć funkcji pingouin.linear_regression ( zastrzeżenie: jestem twórcą Pingouina ), która działa z regresją jednokierunkową / wielowariantową przy użyciu tablic NumPy lub Pandas DataFrame, np .:
Wynikiem jest ramka danych ze współczynnikami beta, błędami standardowymi, wartościami T, wartościami p i przedziałami ufności dla każdego predyktora, a także R ^ 2 i skorygowanym R ^ 2 dopasowania.
źródło