概述
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之间线性回归系数的差异所遇到的程序开发问题。
如果您也喜欢它,动动您的小指点个赞吧