使用dplyr::summarise调用fitdist时触发dnorm() NaN警告,单独调用无此问题
解决fitdistrplus::fitdist在dplyr::summarise中产生NaN警告的问题
问题根源
在dplyr::summarise()中传递给fitdist()的数据是带有dplyr特定属性的向量(而非标准numeric类型),这会导致fitdist()内部调用分布密度函数(如dnorm())时,出现临时的无效参数计算(比如参数超出分布函数的有效范围),进而触发NaN警告。直接调用fitdist()时,数据是普通numeric向量,因此不会出现该问题。
解决方案
在调用fitdist()前,将输入数据强制转换为普通numeric向量,移除dplyr附带的额外属性。
修改后的代码
suppressPackageStartupMessages(library(dplyr)) library(fitdistrplus) fun <- function(data, distr = "norm"){ # 转换为标准numeric向量 data <- as.numeric(data) fitdist( data = data, distr = distr, keepdata = FALSE, method = "mme" ) return(1) } # summarise调用不再产生警告 tibble(x = rnorm(100)) |> summarise(fun(x)) # 直接调用依然正常 fun(tibble(x = 1:100)$x)
原理说明
as.numeric()会剥离dplyr向量的特殊属性,让fitdist()处理标准的numeric类型数据,避免内部计算流程因属性干扰生成无效参数,从根源上消除NaN警告。相比用suppressWarnings()掩盖警告的临时方案,这种方法能保留对其他潜在问题的警告提示,更安全可靠。
内容的提问来源于stack exchange,提问作者Richard Telford
相关产品推荐
相关产品推荐

