R语言-相关性分析
- 1.相关性检验类型选择
- 2.导入数据
- 3.相关性分析主体代码
- 3.1首先创建一个空白矩阵,后面循环后的计算结果分别填入
- 3.2批量求解
今天根据自己最近的一个小任务,做光谱与理化性质的相关性分析,总结其中比较重要的两个点写成博文,供大家参考:
1.选择什么类型的相关性检验,求相关系数的数据如何构造
2.怎么批量求相关系数
教程的背景问题是做某一个理化性质属性和光谱的每一个波长做相关性分析,思路是先求一个波长的相关性,循环对每一个波长都求一遍,最后得到一条在整个波段范围上的相关系数变化曲线。
1.相关性检验类型选择
查阅资料,具体参见如何选择相关系数。
相关性检验总共有三种类型:Pearson、Spearman、Kendall,三者区别简而言之是:
Pearson检验:定量数据符合正态分布。
Spearman检验:定量数据不符合正态分布。
Kendall检验:定量数据,检查一致性,类似于多个评委打分,分数之间是否相关。
所以大家根据自己的数据情况,提前做好正态检验,再选择相应的检验类型。这里,我的数据不服从正态分布,所以下面以Spearman检验方法为例。
另外,在分析结果时,需要考虑p值,可参考相关性系数和显著性水平.
2.导入数据
小技巧:大家可以在excel选项设置中,调一下引用格式,方便后面引用列数,不用再数了。
我的数据集构造如下:
表中8-12列是不同的理化性质,我要分别对每一个理化性质求后面13~最后一列的光谱相关系数。我期望得到的结果数据为行数是所有波长的个数,列是不同的理化性质。
这里使用readxl包读取excel数据,针对这个问题,readxl包比xlsx包好用一些。
library(readxl)#用这个包比xlsx包好用一些
导入后,有一点需要注意,导入后的格式为tbl_df,不能用于接下来的相关性分析函数调用,所以转为数据框格式。
an_dan<-as.data.frame(read_excel("data.xlsx",sheet=2))#这里第几个sheet就是第几个
3.相关性分析主体代码
3.1首先创建一个空白矩阵,后面循环后的计算结果分别填入
要分别得到相关系数和检验的p值,所以创建两个矩阵。
#先创建空白矩阵
cor_an<-matrix(NA,nrow = 2001,ncol = 5)#矩阵内容为NA空
colnames(cor_an)<-c("干态明度","润态明度","干态彩度","润态彩度","OM")
p_an<-matrix(NA,nrow = 2001,ncol = 5)
colnames(p_an)<-c("干态明度","润态明度","干态彩度","润态彩度","OM")
3.2批量求解
中心思想:先对一个理化求每一个波段的结果,最后遍历所有理化。
引入k,k代表第几个理化,如果你需要对多个属性求相关性时需要考虑这个。
外层for是对不同的属性循环,8:12是不同的理化性质。
内层for里循环每一个波段。
cor.test函数里,分别放入两个要检测相关性的列数据x,y,位置顺序没有关系,我测试了结果是一样的(统计没学好hhh)。在method里可以换不同的检测方法。结果中可以调用estimate就是相关系数,p.value就是p值,我们需要把他们都分别保存下来。
求解完第一个理化性质t与第一个波长j后,放入事先创建好的空白矩阵结果中,k在这里掌管列数,放入第几列就是第几个理化性质的计算结果。
最后对波长j递增,结果表中的行号i递增。
在第二个循环外,对t+1,计算下一个理化性质,对k+1,准备放入结果的下一列。
最后把结果以csv格式输出。
k<-1#第几个理化
for (t in 8:12) {
i<-1#行号,放到这里是为了每次初始化为1,从第一行开始录入结果
for (j in 13:2013) {#循环每一个波段
cor_an1<-cor.test(an_dan[,t],an_dan[,j],alternative = "two.sided",method = "spearman",conf.level = 0.95)
cor_an[i,k]<-cor_an1$estimate#相关系数
p_an[i,k]<-cor_an1$p.value#p值
j<-j+1
i<-i+1
}
t<-t+1
k<-k+1
}
write.csv(cor_an,"cor_an.csv")
write.csv(p_an,"p_an.csv")
这就是最终的相关系数计算结果,p值表构造相同。行为每一个波长的计算结果。
以上就是R语言循环求多个相关系数的过程,循环得到的结果怎么输入矩阵是一个重要的技巧,无论在别的数据整理、结果整理中都可以借鉴这样的录入思路。