mantelhaen.test()中的外部函数错误中的NA / NaN / Inf

时间:2018-01-24 12:22:44

标签: r

我有一个100k行数据帧,我想在其上计算Cochran-Mantel-Haenszel测试。

我的变量是教育水平和分位数中的计算分数,我的分组变量是性别,代码行如下所示:

mantelhaen.test(db$education, db$score.grouped, db$sex)

此代码抛出此错误并发出警告:

  

qr.default(a,tol = tol)出错:外来函数调用中的NA / NaN / Inf(arg 1)
  另外:警告消息:在ntot * rowsums中:整数溢出产生的NAs

错误似乎是由我的第一个变量引起的,因为测试的7个变量我只有2个问题得到了问题,这似乎没有明显的共同点。

缺少值和因子级别似乎在抛出错误的变量和不变量的变量之间没有差异。我尝试了完整的案例(使用na.omit)并且问题仍然存在。

什么会触发此错误?这是什么意思? 我怎么能摆脱它?

有趣的帖子:R: NA/NaN/Inf in foreign function call (arg 1)What is integer overflow in R and how can it happen?

ADDENDUM :以下是str的结果(失败为educationimc.cl):

str(db[c("education","score.grouped","sex", ...)])
'data.frame':   104382 obs. of  7 variables:
 $ age.cl: Ord.factor w/ 5 levels "<30 ans"<"30-40 ans"<..: 5 2 1 1 3 4 2 3 4 4 ...
  ..- attr(*, "label")= chr "age"
 $ emploi2          : Factor w/ 8 levels "Agriculteurs exploitants",..: 3 5 6 8 8 8 8 3 3 3 ...
  ..- attr(*, "label")= chr "CSP"
 $ tabac            : Factor w/ 4 levels "ancien fumeur",..: 4 1 4 4 3 4 4 1 4 4 ...
  ..- attr(*, "label")= chr "tabac"
 $ situ_mari2       : Factor w/ 3 levels "Vit seul","Divorsé, séparé ou veuf",..: 3 2 1 1 1 3 1 3 2 3 ...
  ..- attr(*, "label")= chr "marriage"
 $ education        : Factor w/ 3 levels "Universitaire",..: 1 1 1 1 3 1 1 1 1 1 ...
 $ revenu.cl        : Factor w/ 4 levels "<1800 euros/uc",..: 3 4 2 NA 4 1 1 4 4 1 ...
 $ imc.cl           : Ord.factor w/ 6 levels "Maigre"<"Normal"<..: 2 2 1 2 3 1 3 2 2 3 ...
  ..- attr(*, "label")= chr "IMC"

编辑:通过在函数内部潜水,错误和警告是由qr.solve调用引起的。我对此一无所知,但我会尝试深入研究 EDIT2 :在qr.solve内,Fortran.F_dqrdc2的调用引发了错误。这超出了我的水平,我的鼻子开始出血 EDIT3 :我尝试head我的数据,找出原因在哪一行:

db2 = db %>% head(99787)   #fails at 99788
db2 = db %>% tail(99698)   #fails at 99699
mantelhaen.test(db2$education, db2$score.grouped, db2$sex)

这给了我很多信息,但也许它可以给你。

1 个答案:

答案 0 :(得分:3)

我能够通过使数据集更大来复制问题。

set.seed(101); n <- 500000
db <- data.frame(education=
                   factor(sample(1:3,replace=TRUE,size=n)),
                 score=
                   factor(sample(1:5,replace=TRUE,size=n)),
                 sex=
                   sample(c("M","F"),replace=TRUE,size=n))

在此之后,mantelhaen.test(db$education, db$score, db$sex)会报告错误。

值得庆幸的是,真正的问题不在QR分解代码的内部:相反,它发生在QR分解之前设置矩阵时。有两个计算ntot*colsumsntot*rowsums,它们会溢出R的整数计算能力。通过创建函数的修改版本,可以通过相对简单的方法解决此问题:

  • 复制源代码:dump("mantelhaen.test",file="my_mh.R")
  • 编辑源代码
    • 升。 1:将函数名称修改为my_mantelhaen.test(以避免混淆)
    • 第199和200行:将ntot更改为as.numeric(ntot),在发生溢出之前将整数转换为双精度
  • source("my_mh.R")阅读新功能

现在

my_mantelhaen.test(db$education, db$score, db$sex)  

应该有效。 你应该肯定测试旧函数的新函数,以确保你能得到相同的答案。

现在发布到R bug list,我们会看到会发生什么......

更新 2018年5月11日:这是fixed in the development version of R(将会是3.6)。