Как передать веса в объекте lm как переменную извне функции и ссылаться на имя столбца как вес в форме модели? - PullRequest
0 голосов
/ 09 апреля 2019

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

1 Ответ

0 голосов
/ 10 апреля 2019

Обновлено

модель $ 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...