Используйте drop.terms
. Предполагая, что каждый член представлен одним столбцом в матрице модели (то есть без факторов с> 2 уровнями), мы вычисляем матрицу модели mm
и находим номера столбцов wx
плохих столбцов. Затем используйте drop.terms
, чтобы удалить эти столбцы из объекта терминов и извлечь формулу из пересмотренного объекта терминов.
mtcars[1, 3] <- Inf
# is.na is TRUE for NA or NaN; is.infinite is TRUE for Inf or -Inf
is.bad <- function(x) any(is.na(x) | is.infinite(x))
fo_terms <- terms(myFormula) # myFormula is taken from question
mm <- model.matrix(myFormula, mtcars)
wx <- which(apply(mm[, -1], 2, is.bad))
fo_terms2 <- drop.terms(fo_terms, wx, keep.response = TRUE)
fo2 <- formula(fo_terms2)
myFormula
## mpg ~ cyl + I(disp/hp) + I(wt^2) + I((qsec + vs)/gear)
fo2
## mpg ~ cyl + I(wt^2) + I((qsec + vs)/gear)
Обновление
Если вы хотите удалить из формулы неверные строки, а не термины, то:
lm(myFormula, mtcars, subset = !apply(mm, 1, is.bad))
Обратите внимание, что lm
автоматически удалит строки с NA и NaN (зависят от аргумента na.action
), поэтому в этом случае вы можете упростить is.bad
, чтобы проверять только Inf
и -Inf
.
Другим подходом было бы заменить Inf
и -Inf
на NA.
mtcars[is.infinite(mtcars)] <- NA
и затем выполните lm
в обычном режиме.