簡體   English   中英

使用scipy.stats和statsmodels計算線性回歸時的結果不同

[英]Different results when computing linear regressions with scipy.stats and statsmodels

當我嘗試將OLS與這兩個庫擬合時,我得到了r ^ 2(確定系數)的不同值,但我不太清楚為什么。 (為方便起見,刪除了一些間距)

In [1]: import pandas as pd       
In [2]: import numpy as np
In [3]: import statsmodels.api as sm
In [4]: import scipy.stats
In [5]: np.random.seed(100)
In [6]: x = np.linspace(0, 10, 100) + 5*np.random.randn(100)
In [7]: y = np.arange(100)

In [8]: slope, intercept, r, p, std_err = scipy.stats.linregress(x, y)

In [9]: r**2
Out[9]: 0.22045988449873671

In [10]: model = sm.OLS(y, x)
In [11]: est = model.fit()

In [12]: est.rsquared
Out[12]: 0.5327910685035413

這里發生了什么? 我想不通! 哪里有錯誤?

這不是已回答的原始問題的答案。

在無常數的回歸中關於R平方。

一個問題是沒有截距的回歸不具有R ^ 2的標准定義。

本質上,R平方作為具有截距的模型中的擬合優度,將完整模型與僅具有截距的模型進行比較。 如果完整模型沒有截距,則R ^ 2的標准定義會產生奇怪的結果,例如負R ^ 2。

沒有常數的回歸中的常規定義是除以因變量的平方和而不是除法的。 不能以有意義的方式真正比較具有常數和沒有常數的回歸之間的R ^ 2。

例如,在非常數回歸中查看觸發statsmodels更改以“正確”處理R ^ 2的問題: https : //github.com/statsmodels/statsmodels/issues/785

0.2205來自有截距項的模型-如果刪除截距,則結果為0.5328。

基本上,一個程序包正在建模y = bx,而另一個程序包(有幫助地)假設您希望使用攔截項(即y = a + bx )。 [注意:此假設的優點是,否則每次您要運行回歸時,您都必須采用x並將一列的列綁定到x上 (否則最終將產生有偏差的模型)]

查看這篇文章 ,進行更長時間的討論。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM