model.frame и обновление - PullRequest
       38

model.frame и обновление

5 голосов
/ 11 марта 2012

В R вы могли бы оценить модель с лог-преобразованной зависимой переменной:

mfit <- lm(
    formula = log(salary) ~ yrs.service + yrs.since.phd, 
    data    = Salaries
  )

Тогда вы можете захотеть изменить фрейм модели и вызвать обновление, чтобы обновить модель:

n     <- nrow(Salaries)
mfr   <- model.frame(mfit)[sample(1:n, size=n, replace=TRUE),]
mfit2 <- update(mfit, data = mfr)

Это приведет к ошибке:

Error in eval(expr, envir, enclos) : object 'salary' not found

Причина в том, что формула все еще имеет зависимую переменную log(salary), а переменная в фрейме модели называется log(salary).R думает, что может найти salary и затем вызвать log.Та же самая ошибка произошла бы без повторной выборки, пример показывает, почему кто-то может захотеть это сделать.

Вышеприведенная процедура происходит из пакета начальной загрузки, в котором выполняется повторная выборка строк.Такое поведение следует ожидать, или это ошибка?Я знаю, что можно обойти это, преобразовав переменные в аргументе data, но это кажется раздражающим и упускаемым из виду ...

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Вместо выборки из model.frame(mfit) вы можете выбрать из na.omit(get_all_vars(myformula, Salaries)). Итак, ваш пример станет следующим:

myformula <- log(salary) ~ yrs.service + yrs.since.phd

mfit <- lm(formula = myformula, data = Salaries)

n       <- nrow(Salaries)
newdata <- na.omit(get_all_vars(myformula, Salaries))[sample(1:n, size=n, replace=TRUE),]
mfit2   <- update(mfit, data = newdata)

Мы можем использовать следующий простой пример, чтобы подтвердить, что model.frame(myformula, df) и na.omit(get_all_vars(myformula, df)) выбирают одинаковые необработанные (не преобразованные) данные из фрейма данных:

df <- data.frame(w = rnorm(10), x = rnorm(10), y = rnorm(10), z = rnorm(10))
df[1, 1] <- NA
df[2, 2] <- NA
df[3, 3] <- NA
df[4, 4] <- NA

identical(data.frame(na.omit(get_all_vars(z ~ w + x, df))), data.frame(model.frame(z ~ w + x, df)))
# [1] TRUE

Обратите внимание, что я обернул результаты na.omit(get_all_vars(...)) и model.frame(...) в data.frame, чтобы отбросить посторонние атрибуты для сравнения. Конечно, model.frame выполняет дополнительную работу, например, преобразование зарплаты в вашем примере. Но если все, что вам нужно сделать, это сэмплировать исходные данные, то na.omit(get_all_vars(...)) работает нормально, а затем вы можете передать новый фрейм данных в lm или update.

0 голосов
/ 24 апреля 2012

Я не думаю, что это ошибка. Поскольку формула может получать функции и операторы, т.е.

log(foo)*3 ~ abs(fooller) + fooz

Он не может отделить объект под названием abs(fooller) от результата функции abs() с аргументом fooller.

На мой взгляд, это проблема соглашений об именах . Вы не должны называть переменную или столбец как имя, которое может быть неправильно понято как функция. Вместо этого вы можете использовать salary.log.

...