У меня есть функция для создания объекта 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$weights
?
Он дает значение весов, а не имя столбца.
Используйте bquote для вычислений на языке, а затем eval.
Не могли бы вы уточнить?
Обновлено
model$call[[i]] возвращает значения параметров lm() побуквенно, так что не только model$call[[4]] выглядит неинформативно, но и model$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")
Для моей цели я хочу, чтобы model$call[[4]] возвращал имя столбца, который использовался в качестве весов. это обязательно
Ваш вопрос кажется очень теоретическим, и поэтому становится еще труднее ответить без каких-либо рабочих данных. Кроме того, в вашем заявлении
if...else
вы, кажется, пропустили звонокif
?