cor.test,“没有足够的有限观察”

时间:2016-12-25 14:20:55

标签: r

我使用两种不同的方式来使用cor.test,一种在我自己的函数中,另一种直接使用cor.test。当我在自己的函数中使用cor.test时,它出现了错误,它怎么可能发生?

这是确定

cor.test(x=cust_new$maintain_cust/cust_new$ttl_cust,
         y=cust_new$ttl_cust,alternative="two.sided",
         method="pearson",conf.level=0.95)

以下内容会出错:

  

“没有足够的有限观察”

cor_result<-function(x,y,data){
  a<-cor.test(x=as.numeric(data$x)/as.numeric(data$y),
              y=as.numeric(data$y),
              alternative="two.sided",method="spearman",
              conf.level=0.95)
  r<-a$estimate
  p<-a$p.value
  c<-data.frame(r=r,p=p)
  return(c)
}

d<-cor_result(x=maintain_cust,y=ttl_cust,data=cust_new)

以下内容会出错:

  

'y'必须是数字向量“

cor_result<-function(x,y,data){
  a<-cor.test(x=data$x/data$y,y=data$y,
            alternative="two.sided",method="spearman",conf.level=0.95)
  r<-a$estimate
  p<-a$p.value
  c<-data.frame(r=r,p=p)
  return(c)
}

d<-cor_result(x=maintain_cust,y=ttl_cust,data=cust_new)

dput(cust_new),一些示例

structure(list(data_month = structure(c(16953, 16983, 17014, 
17045, 17075, 17106, 16953, 16983, 17014, 17045), class = "Date"), 
    ttl_cust = c(383L, 580L, 735L, 850L, 952L, 1062L, 2418L, 
    2492L, 2515L, 2550L), maintain_cust = c(179L, 266L, 355L, 
    413L, 448L, 508L, 935L, 1026L, 1091L, 1143L)), row.names = c(NA, 
10L), class = "data.frame", .Names = c("data_month", "ttl_cust", 
"maintain_cust"))

2 个答案:

答案 0 :(得分:1)

您没有正确地将矢量(即数据帧列)传递给函数。考虑传递要使用双括号引用的数据框列的字符串文字(如果列是数字类型,则可能不需要as.numeric()):

cor_result<-function(x, y, data){ 
   a<-cor.test(x=as.numeric(data[[x]])/as.numeric(data[[y]]),y=as.numeric(data[[y]]),
               alternative="two.sided", method="spearman", conf.level=0.95) 
   r<-a$estimate 
   p<-a$p.value 
   c<-data.frame(r=r,p=p) 
   return(c) 
}

d<-cor_result(x="maintain_cust", y="ttl_cust", data=cust_new)

或者没有 data 参数:

cor_result<-function(x, y){ 
   a<-cor.test(x=(x/y),y=y,
               alternative="two.sided", method="spearman", conf.level=0.95) 
   r<-a$estimate 
   p<-a$p.value 
   c<-data.frame(r=r,p=p) 
   return(c) 
}

d<-cor_result(x=cust_new$maintain_cust, y=cust_new$ttl_cust)

答案 1 :(得分:0)

从根本上来说,我认为这是对引用数据集中列的方式的混淆。特别是,当使用$ - 在$解释字面之后对符号编制索引。当您在第一个函数中引用data$xdata$y时,R正在查找名为&#34; x&#34;的列。和&#34; y&#34;在您的data对象中。这些不存在于您的数据框中,因此返回NULL(如果R在这种情况下引发错误,可能会更好,但是哦......)

  • 在您的第一个功能中,您使用as.numeric()as.numeric(NULL)返回numeric(0)(零长度数字向量)。因此,cor.test试图计算两个零长度对象之间的相关性,并且可以理解地抛出了不够的有限观察值。错误。 (尝试cor.test(numeric(0),numeric(0))复制。)
  • 在你的第二个功能中,你不能翻译成数字,所以你正在执行cor.test(NULL,NULL),这使得&#34;必须是一个数字向量&#34;错误。

那你能做什么?

  • @Parfait的建议#1:将xy作为字符串传递并使用[[ - 索引而不是$ - 索引
  • @Parfait的建议#2:将xy作为对象传递(即,不要在data中查找)

如果你真的想(1)使用data参数并且(2)将值作为符号传递,那么它就会变得棘手来正确地做事。

  • 最简单的方法是调用deparse(substitute(x))来检索用作字符串的符号的名称,然后使用[[ - 索引
  • 否则,如果您仔细使用,则可以使用eval。例如:
f <- function(a,b,data=dd) {
   eval(substitute(a/b,list(a=quote(x),b=quote(y))),envir=dd)
}
dd <- data.frame(x=1,y=2)
## set x and y to other values in the global env 
##   so we can see that we got the right ones ...  
x <- 3
y <- 4
f(x,y)
## 0.5