Diferencia entre coeficientes de regresión lineal entre Python y R

Estoy tratando de ejecutar una regresión lineal en Python que ya hice en R para encontrar variables con coeficientes 0. El problema con el que me estoy encontrando es que la regresión lineal en R devuelve NA para columnas con baja varianza, mientras que la regresión de aprendizaje scikit devuelve los coeficientes. En el código R, encuentro y guardo estas variables guardando las variables con NA como resultado de la regresión lineal, pero parece que no puedo encontrar una manera de imitar este comportamiento en Python. El código que estoy usando se puede encontrar a continuación.

Código 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)

Código de 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_)

Salida de 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"

Salida de Python:

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

Como puede ver, los valores para las columnas 'b', 'c' y 'e' son cercanos, pero muy diferentes para 'd', 'f' y 'g'. Para este ejemplo de regresión, me gustaría devolver ['d', 'f', 'g'] ya que sus resultados son NA de R. El problema es que la regresión lineal de sklearn devuelve 0 para col 'd', mientras que devuelve -35.31 para col 'f' y -3.531 para col 'g'.

¿Alguien sabe cómo R decide si devolver NA o un valor / cómo implementar este comportamiento en la versión de Python? Saber de dónde provienen las diferencias probablemente me ayudará a implementar el comportamiento R en python. Necesito que los resultados de la secuencia de comandos de Python coincidan exactamente con los resultados de R.

Respuestas a la pregunta(2)

Su respuesta a la pregunta