您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python和R之间线性回归系数的差异

5b51 2022/1/14 8:22:54 python 字数 3779 阅读 552 来源 www.jb51.cc/python

我试图在 Python中运行一个线性回归,我已经在R中完成了为了找到具有0个系数的变量.我遇到的问题是R中的线性回归返回NAs对于低方差的列,而scikit学习回归返回系数.在R代码中,我发现并保存这些变量,通过将NAs作为输出的线性回归保存变量,但我似乎无法想像出一种在python中模拟这种行为的方式.我正在使用的代码可以在下面找到. R代码: a <- c(23, 45, 546, 42, 6

概述

R代码

a <- c(23,45,546,42,68,15,47)
b <- c(1,2,4,6,34,8)
c <- c(22,33,44,55,66,77,88)
d <- c(1,1,1)
e <- c(1,1.1)
f <- c(1,1.01)
g <- c(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,47]
b = [1,8]
c = [22,88]
d = [1,1]
e = [1,1.1]
q = [1,1.01]
f = [1,1.001]


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


var_list = ['b','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,而它返回-35.31为col’f’,-3.531为col’g’.

有没有人知道R如何决定是否返回NA或值/如何将此行为实现到Python版本?知道差异在哪里可能有助于我在Python中实现R行为.我需要python脚本的结果来匹配R输出.

关于QR分解的更多信息在线性回归的上下文中:
https://www.stat.wisc.edu/~larget/math496/qr.html

来自sklearn的代码基本上是一个关于numpy.linalg.lstsq的包装器,它最小化了欧几里德二次规范.如果您的模型是Y = AX,它最小化|| Y – AX || ^ 2.这是一个不同的(和计算上不太稳定的)算法,它没有QR分解的很好的副作用.

个人笔记:如果您想在经过验证和经过验证的计算框架中对模型进行稳健的拟合,并坚持使用Python,请寻找基于QR或SVD的线性回归实现.软件包scikit-learn或statsmodels(至今仍然在2017年4月22日进行测试)应该让你在那里.

总结

以上是编程之家为你收集整理的Python和R之间线性回归系数的差异全部内容,希望文章能够帮你解决Python和R之间线性回归系数的差异所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶