Como posso encontrar o valor-p (significância) de cada coeficiente?
lm = sklearn.linear_model.LinearRegression()
lm.fit(x,y)
python
numpy
statistics
scikit-learn
regression
elplatt
fonte
fonte
Respostas:
Isso é um exagero, mas vamos tentar. Primeiro vamos usar o statsmodel para descobrir quais devem ser os valores-p
e chegamos
Ok, vamos reproduzir isso. É um exagero, já que estamos quase reproduzindo uma análise de regressão linear usando a Álgebra de Matrizes. Mas que diabos.
E isso nos dá.
Assim, podemos reproduzir os valores do statsmodel.
fonte
code
np.linalg.inv às vezes pode retornar um resultado mesmo quando a matriz não é invertível. Esse pode ser o problema.nan
s. Para mim, foi porque os meusX
eram uma amostra dos meus dados e o índice estava desativado. Isso causa erros ao chamarpd.DataFrame.join()
. Eu fiz essa alteração de uma linha e parece funcionar agora:newX = pd.DataFrame({"Constant":np.ones(len(X))}).join(pd.DataFrame(X.reset_index(drop=True)))
O LinearRegression do scikit-learn não calcula essas informações, mas você pode estender facilmente a classe para fazê-lo:
Roubado daqui .
Você deve dar uma olhada nos modelos de estatísticas para esse tipo de análise estatística no Python.
fonte
EDIT: Provavelmente não é o caminho certo para fazê-lo, ver comentários
Você pode usar sklearn.feature_selection.f_regression.
clique aqui para a página scikit-learn
fonte
O código na resposta do elyase https://stackoverflow.com/a/27928411/4240413 não funciona realmente. Observe que sse é um escalar e tenta iterar através dele. O código a seguir é uma versão modificada. Não é incrivelmente limpo, mas acho que funciona mais ou menos.
fonte
Uma maneira fácil de obter os valores p é usar a regressão de modelos estatísticos:
Você obtém uma série de valores-p que você pode manipular (por exemplo, escolha a ordem que deseja manter avaliando cada valor-p):
fonte
p_value está entre as estatísticas f. se você deseja obter o valor, basta usar estas poucas linhas de código:
fonte
Pode haver um erro na resposta de @JARH no caso de uma regressão multivariável. (Não tenho reputação suficiente para comentar.)
Na seguinte linha:
p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-1))) for i in ts_b]
,os valores t seguem uma distribuição qui-quadrado de grau em
len(newX)-1
vez de seguir uma distribuição qui-quadrado de graulen(newX)-len(newX.columns)-1
.Portanto, isso deve ser:
p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-len(newX.columns)-1))) for i in ts_b]
(Consulte os valores t para regressão OLS para obter mais detalhes)
fonte
Você pode usar scipy para valor-p. Este código é da documentação scipy.
fonte
Para uma linha, você pode usar a função pingouin.linear_regression ( aviso: eu sou o criador do Pingouin ), que funciona com regressão uni / multivariável usando matrizes NumPy ou Pandas DataFrame, por exemplo:
A saída é um quadro de dados com os coeficientes beta, erros padrão, valores-T, valores-p e intervalos de confiança para cada preditor, assim como o R ^ 2 e o R ^ 2 ajustado do ajuste.
fonte