簡體   English   中英

Python和R之間的線性回歸系數之間的差異

[英]Difference between Linear Regression Coefficients between Python and R

我試圖在Python中運行已經在R中完成的線性回歸,以便找到系數為0的變量。 我遇到的問題是R中的線性回歸返回低方差列的NA,而scikit學習回歸返回系數。 在R代碼中,我通過將具有NA的變量保存為線性回歸的輸出來查找並保存這些變量,但是我似乎無法找出一種模仿python中這種行為的方法。 我正在使用的代碼可以在下面找到。

R代碼:

a <- c(23, 45, 546, 42, 68, 15, 47)
b <- c(1, 2, 4, 6, 34, 2, 8)
c <- c(22, 33, 44, 55, 66, 77, 88)
d <- c(1, 1, 1, 1, 1, 1, 1)
e <- c(1, 1, 1, 1, 1, 1, 1.1)
f <- c(1, 1, 1, 1, 1, 1, 1.01)
g <- c(1, 1, 1, 1, 1, 1, 1.001)

df <- data.frame(a, b, c, d, e, f, g)
var_list = c('b', 'c', 'd', 'e', 'f', 'g')

target <- temp_dsin.df$a
reg_data <- cbind(target, df[, var_list])


if (nrow(reg_data) < length(var_list)){
  message(paste0('    WARNING: Data set is rank deficient. Result may be doubtful'))
}
reg_model <- lm(target ~ ., data = reg_data)

print(reg_model$coefficients)

#store the independent variables with 0 coefficients
zero_coef_IndepVars.v <- names(which(is.na(reg_model$coefficients)))

print(zero_coef_IndepVars.v)

Python代碼:

import pandas as pd
from sklearn import linear_model

a = [23, 45, 546, 42, 68, 15, 47]
b = [1, 2, 4, 6, 34, 2, 8]
c = [22, 33, 44, 55, 66, 77, 88]
d = [1, 1, 1, 1, 1, 1, 1]
e = [1, 1, 1, 1, 1, 1, 1.1]
q = [1, 1, 1, 1, 1, 1, 1.01]
f = [1, 1, 1, 1, 1, 1, 1.001]


df = pd.DataFrame({'a': a,
                             'b': b,
                             'c': c,
                             'd': d,
                             'e': e,
                             'f': q,
                             'g': f})


var_list = ['b', 'c', 'd', 'e', 'f', 'g']

# build linear regression model and test for linear combination
target = df['a']
reg_data = pd.DataFrame()
reg_data['a'] = target
train_cols = df.loc[:,df.columns.str.lower().isin(var_list)]


if reg_data.shape[0] < len(var_list):
    print('    WARNING: Data set is rank deficient. Result may be doubtful')

# Create linear regression object
reg_model = linear_model.LinearRegression()

# Train the model using the training sets
reg_model.fit(train_cols , reg_data['a'])

print(reg_model.coef_)

R的輸出:

(Intercept)           b           c           d           e           f           g 
 537.555988   -0.669253   -1.054719          NA -356.715149          NA          NA 

> print(zero_coef_IndepVars.v)
[1] "d" "f" "g"

Python的輸出:

           b             c   d               e              f            g
[-0.66925301   -1.05471932   0.   -353.1483504   -35.31483504   -3.5314835]

如您所見,列“ b”,“ c”和“ e”的值很接近,但是對於“ d”,“ f”和“ g”而言卻大不相同。 對於此示例回歸,我想返回['d','f','g'],因為它們的輸出是R的NA。問題是sklearn線性回歸的col'd'返回0。對於col'f'為-35.31,對於col'g'為-3.531。

有誰知道R如何決定是否要返回NA或值/如何在Python版本中實現此行為? 知道差異的根源可能會幫助我在python中實現R行為。 我需要python腳本的結果來完全匹配R輸出。

在實現上有所不同。 R中的lm使用基於QR分解的基礎C代碼。 模型矩陣被分解為正交矩陣Q和三角矩陣R。這引起了其他人所謂的“共線性檢查”。 R不會檢查,QR分解的性質可確保最小共線性變量在擬合算法中獲得“優先級”。

有關線性回歸情況下QR分解的更多信息: https : //www.stat.wisc.edu/~larget/math496/qr.html

從sklearn代碼基本上是圍繞一個包裝numpy.linalg.lstsq ,其歐幾里得范數平方最小化。 如果您的模型為Y = AX ,則它將||Y - AX||^2最小化。 這是一種不同的算法(並且計算不穩定),並且沒有QR分解的副作用。

個人說明:如果您想在經過驗證和測試的計算框架中對模型進行穩健的擬合,並堅持使用Python,請尋找基於QR或SVD的線性回歸實現。 軟件包scikit-learnstatsmodels (仍為beta版(截至2017年4月22日))將帶您到達那里。

我猜沒有足夠的數據。 這是statsmodel的結果:

 import statsmodels.formula.api as smf lm = smf.ols(formula='a ~ b + c + d + e + f + g', data=df).fit() lm.summary() 

給出:

 OLS Regression Results Dep. Variable: a R-squared: 0.038 Model: OLS Adj. R-squared: -0.923 Method: Least Squares F-statistic: 0.03993 Date: Fri, 21 Apr 2017 Prob (F-statistic): 0.987 Time: 22:29:16 Log-Likelihood: -46.059 No. Observations: 7 AIC: 100.1 Df Residuals: 3 BIC: 99.90 Df Model: 3 Covariance Type: nonrobust coef std err t P>|t| [95.0% Conf. Int.] Intercept 151.5350 1065.536 0.142 0.896 -3239.476 3542.545 b -0.6693 10.324 -0.065 0.952 -33.526 32.188 c -1.0547 6.412 -0.164 0.880 -21.462 19.352 d 151.5350 1065.536 0.142 0.896 -3239.476 3542.545 e -368.1353 3862.592 -0.095 0.930 -1.27e+04 1.19e+04 f 99.5679 574.110 0.173 0.873 -1727.506 1926.642 g 146.3383 1016.341 0.144 0.895 -3088.111 3380.788 Omnibus: nan Durbin-Watson: 2.447 Prob(Omnibus): nan Jarque-Bera (JB): 4.545 Skew: 1.797 Prob(JB): 0.103 Kurtosis: 4.632 Cond. No. 1.34e+18 

OLS提供了一些線索,說明該線性問題病情不佳。

暫無
暫無

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

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