Векторизованная модель лайнера - PullRequest
0 голосов
/ 26 марта 2020

Используя lm () в R , я могу сделать следующее

fit <- lm(organ_volumes~sex+genotype, data=factors)

, где объемы органов - это матрица, в которой каждый столбец - это отдельная переменная. Каждый столбец, в свою очередь, соответствует линейной модели, как описано в документах lm :

Если ответ представляет собой матрицу, линейная модель подбирается наименьшими квадратами отдельно для каждого столбца матрицы.

Есть ли способ сделать нечто подобное в Python, используя statsmodels вместо того, чтобы l oop по каждому столбцу, что намного медленнее, чем метод R?

1 Ответ

1 голос
/ 26 марта 2020

Вы можете попробовать следующее в scikit, просто обратите внимание, что иногда для коррелированных зависимых переменных выход отличается от R:

from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(data= iris['data'],
                     columns= iris['feature_names'] )

from sklearn import linear_model
clf = linear_model.LinearRegression()
X = df[['sepal length (cm)','sepal width (cm)']]
Y = df[['petal length (cm)','petal width (cm)']]
clf.fit(X,Y)
clf.coef_

array([[ 1.77559255, -1.33862329],
       [ 0.723292  , -0.47872132]])

В R:

data = as.matrix(iris[,-5])
lm(data[,c(1,3)] ~ data[,c(2,4)])

Call:
lm(formula = data[, c(1, 3)] ~ data[, c(2, 4)])

Coefficients:
                            Sepal.Length  Petal.Length
(Intercept)                  3.4573        2.2582     
data[, c(2, 4)]Sepal.Width   0.3991       -0.3550     
data[, c(2, 4)]Petal.Width   0.9721        2.1556    
...