¿Cómo puedo encontrar el valor p (significancia) de cada coeficiente?
lm = sklearn.linear_model.LinearRegression()
lm.fit(x,y)
python
numpy
statistics
scikit-learn
regression
elplatt
fuente
fuente
Respuestas:
Esto es una especie de exageración, pero vamos a intentarlo. Primero usemos statsmodel para averiguar cuáles deberían ser los valores p
y obtenemos
Ok, reproduzcamos esto. Es una especie de exageración, ya que casi estamos reproduciendo un análisis de regresión lineal usando Matrix Algebra. Pero qué diablos.
Y esto nos da.
Entonces podemos reproducir los valores de statsmodel.
fuente
code
np.linalg.inv a veces puede devolver un resultado incluso cuando la matriz no es invertable. Ese podría ser el problema.nan
s. Para mí fue porque misX
eran una muestra de mis datos, por lo que el índice estaba apagado. Esto causa errores al llamarpd.DataFrame.join()
. Hice este cambio de línea y parece que funciona ahora:newX = pd.DataFrame({"Constant":np.ones(len(X))}).join(pd.DataFrame(X.reset_index(drop=True)))
LinearRegression de scikit-learn no calcula esta información, pero puede ampliar fácilmente la clase para hacerlo:
Robado de aquí .
Debe echar un vistazo a los modelos de estadísticas para este tipo de análisis estadístico en Python.
fuente
EDITAR: Probablemente no sea la forma correcta de hacerlo, ver comentarios
Puede usar sklearn.feature_selection.f_regression.
Haga clic aquí para la página de aprendizaje de scikit
fuente
El código en la respuesta de elyase https://stackoverflow.com/a/27928411/4240413 en realidad no funciona. Observe que sse es un escalar y luego intenta iterar a través de él. El siguiente código es una versión modificada. No es increíblemente limpio, pero creo que funciona más o menos.
fuente
Una forma fácil de extraer los valores p es usar la regresión de modelos de estadísticas:
Obtiene una serie de valores p que puede manipular (por ejemplo, elija el orden que desea mantener evaluando cada valor p):
fuente
p_value está entre las estadísticas f. si desea obtener el valor, simplemente use estas pocas líneas de código:
fuente
Podría haber un error en la respuesta de @JARH en el caso de una regresión multivariable. (No tengo suficiente reputación para comentar).
En la siguiente linea:
p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-1))) for i in ts_b]
,los valores t siguen una distribución de grado chi-cuadrado en
len(newX)-1
lugar de seguir una distribución de grado chi-cuadradolen(newX)-len(newX.columns)-1
.Entonces esto debería ser:
p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-len(newX.columns)-1))) for i in ts_b]
(Ver valores t para la regresión de OLS para más detalles)
fuente
Puede usar scipy para el valor p. Este código es de documentación descuidada.
fuente
Para una línea, puede usar la función pingouin.linear_regression ( descargo de responsabilidad: soy el creador de Pingouin ), que funciona con regresión uni / multi-variada usando matrices NumPy o Pandas DataFrame, por ejemplo:
El resultado es un marco de datos con los coeficientes beta, los errores estándar, los valores T, los valores p y los intervalos de confianza para cada predictor, así como el R ^ 2 y el R ^ 2 ajustado del ajuste.
fuente