将偏移量参数传递给 lm 函数
Pass offset arguments into lm function
我正在进行线性回归,我想修正一些输入。我已经找到使用 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)
然后我需要一个函数来写出上面的公式,但我不知道如何编写具有 inputs_fix
和 inputs_fix_coef
对象的表达式 offset(0.1*c) - c + offset(0.05*d) - d
。
可能吗?还有另一种固定系数的方法(更优雅)?感谢任何帮助
更新:根据@Jan van der Laan 建议
使用paste
和as.formula
创建公式
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
处理此问题的一种方法是计算一个包含总偏移量的新列,并从数据集中删除偏移量中使用的列:
# 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
将 is 转换为公式对象,但我怀疑上面的解决方案更简洁。
我正在进行线性回归,我想修正一些输入。我已经找到使用 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)
然后我需要一个函数来写出上面的公式,但我不知道如何编写具有 inputs_fix
和 inputs_fix_coef
对象的表达式 offset(0.1*c) - c + offset(0.05*d) - d
。
可能吗?还有另一种固定系数的方法(更优雅)?感谢任何帮助
更新:根据@Jan van der Laan 建议
使用paste
和as.formula
创建公式
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
处理此问题的一种方法是计算一个包含总偏移量的新列,并从数据集中删除偏移量中使用的列:
# 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
将 is 转换为公式对象,但我怀疑上面的解决方案更简洁。