gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:36:24 26 4
gpt4 key购买 nike

我正在尝试在 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,而它返回-35.31 用于列 'f' 和 -3.531 用于列 'g'。

有谁知道 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 包(截至 2017 年 4 月 22 日仍处于测试阶段)应该可以帮助您。

关于python - Python 和 R 之间的线性回归系数之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49962170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com