Вместо выборки из 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
.