r - 从 R 中 lm 之前的公式中删除 Inf 值
问题描述
假设我使用 mtcars 数据集来设置任意公式:
data(mtcars)
myFormula <- as.formula("mpg ~ cyl + I(disp / hp) + I(wt^2) + I((qsec + vs) / gear)")
我想在lm
函数中使用该公式,但在此之前,我想删除包含Inf
,NaN
和NA
. 例如,如果disp / hp
导致任何Inf values
我想删除包含它的行。我知道我可以通过首先生成新变量,删除Inf
然后使用公式运行 lm 来做到这一点,但我想使用公式术语来做到这一点,因为它是闪亮应用程序的一部分并且公式是输入的。
我的尝试:
formulaTerms <- terms(myFormula)
formulaTerms <- gsub("I", "", labels(formulaTerms))
formulaTermsRatio <- formulaTerms[grep("/", formulaTerms)]
mtcarsDT <- setDT(mtcars)
mtcarsDT <- mtcarsDT[, formulaTermsRatio[1] := sym(formulaTermsRatio[1])]
解决方案
使用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
将自动删除带有 NAs 和 NaNs 的行(取决于na.action
参数),因此在这种情况下,您可以简化is.bad
为仅检查Inf
and -Inf
。
另一种方法是用 NA替换Inf
和。-Inf
mtcars[is.infinite(mtcars)] <- NA
然后lm
正常执行。
推荐阅读
- c - 这个 C 程序没有执行
- yaml - 从 curl 导出 gitlabci 中的 JSON 值
- microcontroller - PIC16 和 EUSART
- amazon-s3 - 无服务器 .getObjectTagging 不是函数
- java - listAll() 不适用于 Android 中的 firebase
- python - Pandas groupby 具有针对大型数据集和大量组的自定义函数
- javascript - 是否可以使用 JavaScript 在页面上的亮模式和暗模式之间切换?
- python - 如何隐藏打印文本
- typescript - 如何在 vue.js 版本 3 中上传文件
- azure-data-factory - 调试和触发管道执行两次