我有一个函数为多个模型迭代创建lm对象,权重是函数的输入,它采用不同的列值。
这是假的:
x <-c(rnorm(10),NA)
df <- data.frame(y=1+2*x+rnorm(11)/2, x=x, wght1=1:11)
## Fancy weights as numeric vector
df$weight <- (df$wght1)^(3/4)
weight_var <- "weight"
model <- lm(y~x,data=df,weights=df[, weight_var])
model$call[[4]]
看,model$call[[4]]
返回df[, weight_var]
,我希望它返回列weight
而不是;这是对该变量的引用
假设我在数据中有列a,b,c,d,e,我想运行模型并检查权重是否为d或e。
因此,我将if语句定义为:
if (weight_var[[1]]=='') {
model <- lm(formula = eqmodel, xdata)
} else {
model <- lm(formula = eqmodel, xdata, weights = xdata[,weight_var])
}
其中weight_var
可以是d
或e
。所以当我们打电话时:
model$call[[4]]
输出是d
或e
。
但是,当我看到模型为:
Call:
lm(formula = eqmodel, data = xdata, weights = xdata[, weight_var])
我没关系,eqmodel是从函数外部指定的模型方程。但是,我希望权重在传递时为d或e。有办法吗?
更新
model $ call [[i]]逐字母返回lm()参数的值,因此不仅模型$ call [[4]]看起来没有信息,而且模型$ call [[2]]返回的是公式名称公式。下面一个技巧来改善它一点点。
x <-c(rnorm(10),NA)
df <- data.frame(y=1+2*x+rnorm(11)/2, x=x, wght1=1:11)
## Fancy weights as numeric vector
df$weight <- (df$wght1)^(3/4)
weight_var <- "weight"
eqmodel <- as.formula("y~x")
xdata <- df
### unprocessed:
if (weight_var[[1]]=='') {
model <- lm(formula = eqmodel, xdata)
} else {
model <- lm(formula = eqmodel, xdata, weights = xdata[,weight_var])
}
summary(model)
#Call:
#lm(formula = eqmodel, data = xdata, weights = xdata[, weight_var])
### a little trick:
if (weight_var[[1]]=='') {
model <- lm(formula = eqmodel, xdata)
} else {
model <- lm(formula = eqmodel, xdata, weights = xdata[,weight_var])
model$call[[4]] <- weight_var[[1]]
}
model$call[[2]] <- eqmodel
summary(model)
#Call:
#lm(formula = y ~ x, data = xdata, weights = "weight")