如何将lm对象中的权重作为变量从函数外部传递,并在模型表单中将列名称作为权重引用?

问题描述 投票:0回答:1

我有一个函数为多个模型迭代创建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可以是de。所以当我们打电话时:

model$call[[4]]

输出是de

但是,当我看到模型为:

Call:
lm(formula = eqmodel, data = xdata, weights = xdata[, weight_var])

我没关系,eqmodel是从函数外部指定的模型方程。但是,我希望权重在传递时为d或e。有办法吗?

r lm weight
1个回答
0
投票

更新

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")
© www.soinside.com 2019 - 2024. All rights reserved.