【发布时间】:2017-09-17 09:31:03
【问题描述】:
我正在尝试在 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 用于 col 'f' 和 -3.531 用于 col 'g'。
有谁知道 R 如何决定是返回 NA 还是返回值/如何将这种行为实现到 Python 版本中?了解差异的来源可能会帮助我在 python 中实现 R 行为。我需要 python 脚本的结果与 R 输出完全匹配。
【问题讨论】:
-
请注意他们是
NA,而不是NaN。 -
@SinanÜnür 所以你认为在 R 线性回归中存在共线性检查吗?我认为它是这样的,这就是为什么我以我的方式选择我的数据,但我需要在 python 中复制这种行为。
标签: python r pandas scikit-learn regression