Как передать веса в объекте lm как переменную извне функции и указать имя столбца как вес в форме модели?

У меня есть функция для создания объекта 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, когда они были переданы. Есть ли способ сделать это?

Ваш вопрос кажется очень теоретическим, и поэтому становится еще труднее ответить без каких-либо рабочих данных. Кроме того, в вашем заявлении if...else вы, кажется, пропустили звонок if?

heck1 09.04.2019 07:30

Обновлено, фиктивный фрейм данных и код. Пожалуйста, дайте мне знать, если нужна дополнительная информация

Bruce Wayne 09.04.2019 07:45

как насчет model$weights?

heck1 09.04.2019 08:05

Он дает значение весов, а не имя столбца.

Bruce Wayne 09.04.2019 08:08

Используйте bquote для вычислений на языке, а затем eval.

Roland 09.04.2019 08:31

Не могли бы вы уточнить?

Bruce Wayne 09.04.2019 19:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
193
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено

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]] возвращал имя столбца, который использовался в качестве весов. это обязательно

Bruce Wayne 10.04.2019 18:45

Другие вопросы по теме