Передать аргументы смещения в функцию lm

Я делаю линейную регрессию и хочу исправить некоторые входные данные. Я нашел способ сделать это с помощью offset. Посмотрим на это на примере:

set.seed(145)
df <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10), d = rnorm(10))

summary(lm(formula = a ~ . + offset(0.1*c) - c + offset(0.05*d) - d, data = df))

Проблема в том, что у меня гораздо больше переменных, и я хотел бы автоматически сгенерировать формулу lm.

Скажем, я хочу передать имена входов (которые являются столбцами данных в lm) и значение для его коэффициентов, например, следующим образом:

inputs_fix <- c("c", "d")
inputs_fix_coef <- c(0.1, 0.05)

Затем мне нужна функция, которая записывает мне формулу, как указано выше, но я не знаю, как написать выражение offset(0.1*c) - c + offset(0.05*d) - d, имеющее объекты inputs_fix и inputs_fix_coef.

Является ли это возможным? Есть другой способ поправить коэффициенты (более изящный)? Цени любую помощь

ОБНОВЛЕНИЕ: создание формулы с paste и as.formula с предложением @Jan van der Laan

my.formula <- paste0(" + offset(", inputs_fix_coef, "*", inputs_fix, ") - ", inputs_fix, collapse = " ")
lm.fit <- lm(formula = as.formula(paste0("a ~ .", mi.expresion)), data = df))

Это не так ясно, но он сохраняет все входные данные в объекте lm lm.fit$model, которые потеряны в ответе @Jan van der Laan. И не нужно дублировать data.frame


person Andriy T.    schedule 24.06.2015    source источник


Ответы (1)


Один из способов справиться с этим - вычислить новый столбец с вашим общим смещением и удалить столбцы, используемые в вашем смещении, из набора данных:

# create copy of data withou columns used in offset
dat <- df[-match(inputs_fix, names(df))]

# calculate offset
dat$offset <- 0
for (i in seq_along(inputs_fix)) 
  dat$offset <- dat$offset + df[[inputs_fix[i]]]*inputs_fix_coef[i]

# run regression
summary(lm(formula = a ~ . + offset(offset) - offset, data = dat))

Также всегда можно сгенерировать формулу как вектор символов (используя paste и т. Д.), А затем преобразовать ее в объект формулы с помощью as.formula, но я подозреваю, что приведенное выше решение чище.

person Jan van der Laan    schedule 24.06.2015
comment
Спасибо, это работает! Я нашел способ создать формулу после вашего предложения. Добавить в обновление - person Andriy T.; 24.06.2015
comment
Вы также можете использовать матричное умножение вместо цикла: dat$offset <-as.matrix(df[inputs_fix]) %*% inputs_fix_coef - person Hong Ooi; 24.06.2015