【问题标题】:correlation in R, when I do "pairwise.complet.obs" I get error "standard deviation is 0"R中的相关性,当我执行“pairwise.complet.obs”时,出现错误“标准差为0”
【发布时间】:2014-10-19 08:55:25
【问题描述】:

我正在尝试按组进行一些关联,并且一直在使用这个非常有用的线程:

spearman correlation by group in R

但是,我的 2 个变量和分组中有一些 NA 值,所以我得到 NA 作为每个组的结果

所以我尝试了这个:

> j <- lapply(split(HTNPS, HTNPS$callcat), function(HTNPS){cor(HTNPS$NPS_int, 
HTNPS$holdtime_int,use="pairwise.complete.obs", method = "spearman")})

但是,虽然我得到了更合理的数字,但我收到了以下警告: 在 cor(HTNPS$NPS_int, HTNPS$holdtime_int, 使用 = "pairwise.complete.obs", : 标准差为零

根据要求,我已经为相关列完成了 dput(head(HTNPS,40)

> dput(head(HTNPS[,20:24], 40))
structure(list(holdtime_int = structure(c(6, 11, 7, 7, 5, 7, 
6, 5, 3, 6, 3, 5, 6, 105, 7, 6, 353, 5, 6, 9, 6, 6, 12, 5, 5, 
5, 249, 5, 7, 11, 5, 7, 5, 290, 6, 6, 6, 6, 5, 6), .Dim = c(40L, 
1L)), NPS_int = structure(c(1, NA, NA, 3, NA, 1, 1, 2, NA, NA, 
NA, NA, 3, 2, 1, NA, 2, 4, 1, 2, NA, 3, 1, 1, 1, 1, 1, 1, 1, 
2, 1, 3, 1, 1, 1, 2, 4, 2, 1, 1), .Dim = c(40L, 1L)), HTnot0 = structure(c(6, 
11, 7, 7, 5, 7, 6, 5, 3, 6, 3, 5, 6, 105, 7, 6, 353, 5, 6, 9, 
6, 6, 12, 5, 5, 5, 249, 5, 7, 11, 5, 7, 5, 290, 6, 6, 6, 6, 5, 
6), .Dim = c(40L, 1L)), callcat = structure(c(NA, NA, "CARD", 
"CARD", "GENERAL", "LOAN", "CHANGE DETAILS", "GENERAL", "LOAN", 
"CHANGE DETAILS", "LOAN", "CARD", "FUNDS TRANSFER", "FEE", "BALANCE", 
NA, "CARD", NA, NA, "STATEMENT", "CARD", "CARD", "GENERAL", "CARD", 
"CARD", "TERM DEPOSIT", "CARD", "GENERAL", "CARD", "CARD", "GENERAL", 
NA, NA, NA, NA, "CARD", "CARD", "FUNDS TRANSFER", "GENERAL", 
"MyBusinessOverride"), .Dim = c(40L, 1L), .Dimnames = list(NULL, 
"callcat")), HTcat = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 4L, 1L, 1L, 12L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 9L, 1L, 1L, 1L, 1L, 1L, 1L, 10L, 1L, 1L, 
1L, 1L, 1L, 1L), .Dim = c(40L, 1L), .Dimnames = list(NULL, "HTcat"))), .Names = c("holdtime_int", 
"NPS_int", "HTnot0", "callcat", "HTcat"), row.names = c(NA, 40L
), class = "data.frame")

【问题讨论】:

  • 请告诉我们dput(HTNPS)。问题是由于您执行split(HTNPS, HTNPS$callcat) 后数据的样子。例如,这样的情况会给你同样的错误信息:In cor(c(0, 0), c(0, 0)) : the standard deviation is zero
  • 当我输入 head(dput(HTNPS) (70,000 rows) call_start call_end interaction_id holdtime_int NPS_int HTnot0 callcat HTcat 1 42:14.0 48:58.0 304307105 6 1 6 1 2 48:30.0 48: 59.0 304306379 11 NA 11 1 3 05:21.0 11:20.0 304160541 7 NA 7 CARD 1 4 15:31.0 27:01.0 304166503 7 3 7 CARD 1 5 25:47.0 37:32.0 3014 :12.0 46:18.0 304175845 7 1 7 贷款 1
  • @Rnovice 使用dput(head(HTNPS, 20))
  • 我已将其添加为上面的编辑
  • 您的示例仅生成 NA。给我们一些我们可以合作的东西。

标签: r warnings correlation na


【解决方案1】:

如果您进行拆分,您的许多样本仅包含一个观察值(在删除 NA 之后)。显然没有相关性需要计算。

您收到的警告是两个变量之一仅包含一个值。在您的示例中,例如callcat==FUNDS TRANSFER 的数据框。 holdtime_int 只有一个值(为 6),因此标准差为 0(因此发出警告),结果相关性为 NA。

我不知道您为什么要查看这些相关性,但根据您提供的数据,它们对我来说几乎没有任何意义。如果你想摆脱警告,你可以建立一个检查,例如:

lapply(split(HTNPS,HTNPS$callcat), function(x){
  x <- na.exclude( x[c("holdtime_int","NPS_int")] )
  if(any(sapply(x, function(i)length(unique(i))) < 2 )){
    NA
  } else {
    cor(x[,1],x[,2], method="spearman")
  }
})

这应该会给您相同的结果,但没有警告。请注意使用na.exclude 来摆脱NA。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    相关资源
    最近更新 更多