R 自定义并实现变量相关性

评估两个变量的统计相关性,除了Pearson极差相关系数和Spearman相关系数外,很多情况下的相关性需要我们自己定义。
例如 x,y为每小时收集到的气温和气压测量值。我们定义两者的相关性为x和y同时上升或下降次数占总观测数的比例。

x: 5 12 13 3 6 0 1 15 16 8 88
y: 4 2 3 23 6 10 11 12 6 3 2

用R语言实现思路:
上升或下降的趋势表示
每个预测量后项减去前项,如果>0则表示上升,否则认为下降。(ifelse判断)
占比
相同次数/总次数

代码实现

findud<-function(x){
  ud<-(x[-1]-x[-length(x)])#构造新向量=向量去头/去尾,做差可以得到上升下降趋势
  res<-ifelse(ud>0,1,0)
  return(res)
}

  udcorr<-function(x,y){
    equal<-ifelse(findud(x)==findud(y),1,0)#条件判断,相等计数为1
    res_corr<-sum(equal)/length(x)#做除法
    return(res_corr)
  }

运行上述定义函数

x<-c(5,12,13,3,6,0,1,15,16,8,88)
y<-c(4,2,3,23,6,10,11,12,6,3,2)
udcorr(x,y)

得到结果

 0.3636364

代码优化

1、diff求“滞后”差

x
[1] 5 12 13 3 6 0 1 15 16 8 88
diff(x)
[1] 7 1 -10 3 -6 1 14 1 -8 80
diff(x,2)
[1] 8 -9 -7 -3 -5 15 15 -7 72

2、sign做符号表示

sign(findud(x))
[1] 1 1 0 1 0 1 1 1 0 1

3、mean可以得到0、1数据里的占比求取

res_corr<-sum(equal)/length(x)

可以替换为

mean(equal)

4、lapply可以让list里每一个列表调用同一个函数

参见“lapply,sapply,apply,tapply”的用法区别http://blog.sina.com.cn/s/blog_6caea8bf0100xkpg.html

equal<-ifelse(findud(x)==findud(y),1,0)#条件判断,相等计数为1

函数调用部分替换为

lapply(list(x,y),findud)

最终代码

udcorr2<-function(x,y)mean(sign(diff(x))==sign(diff(y)))

测试结果

udcorr2(x,y)
[1] 0.4

参考《R语言编程艺术》p42

你可能感兴趣的:(R)