R-in sqrt1-h * h:从rcorr内产生的NaN-可用的完整样本数据

问题描述

我有一些代码可以创建调查问题回答矩阵,行-独特调查工具对问题的回答,对各个问题进行列。最后一栏已附加行手段。然后将其传递给rcorr进行评估。我有15组数据,但仅在此特定组内会抛出NaN,我看不出有什么区别。

m.rcorr <- rcorr(matrix,type="pearson")

此处链接一个CSV of the matrix being passed。在某些栏中有合理的NA值,因为并非每个受访者都回答每个问题。其他响应是0、25、50、75或100。

在此数据集上,我收到两个警告:In sqrt(1 - h * h) : NaNs produced

我还有其他14组在没有生成NaN的情况下运行,这些NA的发生率各不相同,我什至看了0是否是问题所在,但其他组再次可以解决这些问题。

接下来,我进入rcorr,将矩阵分配给x:

type <- "pearson"
{
  type <- match.arg(type)
  if (!missing(y)) 
    x <- cbind(x,y)
  x[is.na(x)] <- 1e+50
  storage.mode(x) <- "double"
  p <- as.integer(ncol(x))
  if (p < 1) 
    stop("must have >1 column")
  n <- as.integer(nrow(x))
  if (n < 5) 
    stop("must have >4 observations")
  h <- .Fortran(F_rcorr,x,n,p,itype = as.integer(1 + (type == "spearman")),hmatrix = double(p * p),npair = integer(p * p),double(n),integer(n))

h的分配就是卡住的地方

Error: object 'F_rcorr' not found

Hmisc软件包已安装和加载,同样,此代码在15次中有14次有效。

根据帮助,F_rcorr是内部Hmisc函数,不会被用户调用或未记录,因此我不确定下一步该怎么做。

我想回答两个问题:

  1. 为什么这组特别扔掉NaNs
  2. rcorr结果对列表$ r的最终值有什么影响。

附录:使用注释中建议的Hmisc :::前缀,我可以进一步了解数据中的两对,当h的值为1时,而不是1-h * h的值为0 ,它正在评估两个非常小的负数。它仅出现在这两对中,而没有发生在对角线上,或者发生在该对中的其他位置,所以我不确定为什么这两对产生怪异,因为1-1 * 1应该等于0一整天。

但是,为了解决这个问题,我将rcorr函数复制到一个函数中,在P赋值之前添加了这两行,然后使用了新D的sqrt,该负数将负数替换为0。

 D <- 1 - h * h
 D[D<0] <- 0
 P <- matrix(2 * (1 - pt(q = abs(h) * sqrt(npair - 2)/sqrt(D),df = npair - 2)),ncol = p)

我仍然想知道在计算过程中产生微小负数而不是0的结果是怎么回事,但是我相信我找到了解决该问题的一种无害方法

解决方法

所以我想出了什么问题,然后给哈雷尔博士发了电子邮件,他回信说,在下一个Hmisc出版物中,他打算将sqtr(1 - h * h)替换为max(0,1-h^2),这样可以解决此问题(更加简洁) ),就像我所做的一样,用0代替微小的负数。

我承认我和他一起回答了我的电子邮件。