У меня есть файл со множеством имен переменных и коэффициентов. Задача состоит в том, чтобы использовать эти имена переменных и коэффициенты для создания формулы линейной регрессии и применения ее к данным. Вот небольшой пример:
coefs <- tibble(varname = c("(Intercept)", "dxaids", "abnormal_bun"),
coef = c(-3.1, 0.1, 0.2))
data <- tibble(dxaids = c(0,0,1), abnormal_bun = c(1,0,0))
Цель – новая колонка, эффективно
data %>% mutate(y = -3.1 + 0.1 * dxaids + 0.2 * abnormal_bun)
На данный момент я вручную написал уравнение примерно с 25 переменными.
Конечно, я могу написать для этого уродливый цикл, показанный ниже, но есть ли более чистый способ с помощью инструментов tidyverse? Возможно, это можно сделать с помощью одного умножения матрицы на вектор, но dplyr, похоже, не поддается матричным операциям.
y <- as.numeric(coefs[coefs$varname == "(Intercept)", "coef"])
for (i in 1:nrow(coefs)) {
varname <- as.character(coefs[i,"varname"])
coef <- as.numeric(coefs[i,"coef"])
if (varname != "(Intercept)")
y <- y + coef * data[,varname]
}
@MrFlick в этом случае нам даны только коэффициенты готовой модели. У нас нет модели как объекта lm.





Вы можете избежать использования цикла for, если используете матричное умножение:
coefs$coef[1] + (as.matrix(data) %*% coefs$coef[-1])
[,1]
[1,] -2.9
[2,] -3.1
[3,] -3.0
Просто убедитесь, что столбцы в data соответствуют порядку в coefs$coef[-1]. Например, если столбцы в данных не соответствуют порядку коэффициентов, вы можете просто изменить порядок данных, используя:
data <- data[, 2:1] # note the order is chaged
coefs$coef[1] + (as.matrix (data[, coefs$varname[-1]]) %*% coefs$coef[-1])
[,1]
[1,] -2.9
[2,] -3.1
[3,] -3.0
Будут ли переупорядочены столбцы данных или таблица коэффициентов? Я могу изменить порядок вручную, но не знаю, как это сделать. Возможно, с каким-то видом.
Хорошо. Я думаю, вы правильно сделали, что изменили порядок по coefs$varname, но, возможно, вместо [-1] у нас может быть столбец в data из 1 с для перехвата.
Это при условии, что (Intercept) всегда будет первым кофе в списке, что я считаю разумным.
@qwr верно, (Intercept] предполагается на первой позиции.
Вот мой вариант ответа Джилбера Урбины, в котором используется моя идея матричного умножения.
Вместо добавления перехвата отдельно к данным для переменной перехвата добавляется новый столбец с единицами. Затем столбцы переупорядочиваются в порядке coefs$varname, чтобы умножение матриц было допустимым.
# base R
data1 <- data
data1$`(Intercept)` <- 1
drop(as.matrix(data1[,coefs$varname]) %*% coefs$coef)
# tidyverse pipe style
data %>% mutate(`(Intercept)` = 1) %>% select(coefs$varname) %>%
as.matrix %*% coefs$coef %>% as.numeric
Обычно вы просто используете
predict()вместе со своей моделью, чтобы применить коэффициенты к новым данным. По какой-то причине вы явно пытаетесь этого избежать?