Comment puis-je trouver la valeur p (signification) de chaque coefficient?
lm = sklearn.linear_model.LinearRegression()
lm.fit(x,y)
python
numpy
statistics
scikit-learn
regression
elplatt
la source
la source
Réponses:
C'est un peu exagéré, mais essayons-le. Utilisons d'abord statsmodel pour savoir quelles devraient être les p-values
et nous obtenons
Ok, reproduisons ceci. C'est un peu exagéré car nous reproduisons presque une analyse de régression linéaire en utilisant l'algèbre matricielle. Mais que diable.
Et cela nous donne.
Nous pouvons donc reproduire les valeurs de statsmodel.
la source
code
np.linalg.inv peut parfois renvoyer un résultat même lorsque la matrice n'est pas inversible. Cela pourrait être le problème.nan
s. Pour moi, c'était parce que mes donnéesX
étaient un échantillon de mes données, donc l 'index était désactivé. Cela provoque des erreurs lors de l'appelpd.DataFrame.join()
. J'ai fait ce changement d'une ligne et cela semble fonctionner maintenant:newX = pd.DataFrame({"Constant":np.ones(len(X))}).join(pd.DataFrame(X.reset_index(drop=True)))
LinearRegression de scikit-learn ne calcule pas ces informations, mais vous pouvez facilement étendre la classe pour le faire:
Volé d' ici .
Vous devriez jeter un œil aux statsmodels pour ce type d'analyse statistique en Python.
la source
EDIT: Probablement pas la bonne façon de le faire, voir les commentaires
Vous pouvez utiliser sklearn.feature_selection.f_regression.
cliquez ici pour la page scikit-learn
la source
Le code dans la réponse d'elyase https://stackoverflow.com/a/27928411/4240413 ne fonctionne pas réellement. Notez que sse est un scalaire, puis il essaie de l'itérer. Le code suivant est une version modifiée. Pas incroyablement propre, mais je pense que cela fonctionne plus ou moins.
la source
Un moyen facile d'extraire les p-values est d'utiliser la régression statsmodels:
Vous obtenez une série de p-values que vous pouvez manipuler (par exemple, choisissez l'ordre que vous souhaitez conserver en évaluant chaque p-value):
la source
p_value fait partie des statistiques f. si vous voulez obtenir la valeur, utilisez simplement ces quelques lignes de code:
la source
Il pourrait y avoir une erreur dans la réponse de @JARH dans le cas d'une régression multivariée. (Je n'ai pas assez de réputation pour commenter.)
Dans la ligne suivante:
p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-1))) for i in ts_b]
,les valeurs t suivent une distribution chi-carré du degré
len(newX)-1
au lieu de suivre une distribution chi carré du degrélen(newX)-len(newX.columns)-1
.Cela devrait donc être:
p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-len(newX.columns)-1))) for i in ts_b]
(Voir les valeurs t pour la régression OLS pour plus de détails)
la source
Vous pouvez utiliser scipy pour la valeur p. Ce code est issu de la documentation scipy.
la source
Pour un one-liner, vous pouvez utiliser la fonction pingouin.linear_regression ( avertissement: je suis le créateur de Pingouin ), qui fonctionne avec une régression uni / multi-variée en utilisant des tableaux NumPy ou Pandas DataFrame, par exemple:
La sortie est une trame de données avec les coefficients bêta, les erreurs standard, les valeurs T, les valeurs p et les intervalles de confiance pour chaque prédicteur, ainsi que le R ^ 2 et le R ^ 2 ajusté de l'ajustement.
la source