楼主: danbaidong
15046 16

[问答] 请问如何获得相关系数矩阵的行列名? [推广有奖]

11
hugebear 发表于 2013-6-12 22:55:08
I am sorry I am at school so I can't use Chinese. Actually, you don't need to convert the matrix into a
dataframe, since the matrix also has "dimnames" attribute.
  1. display.correlation <- function(x, alpha = 0.05) {
  2. namelist <- colnames(x)
  3. for(j in 1:(ncol(x) - 1))
  4. {
  5.   for(i in (j + 1):nrow(x))
  6.   if(x[i, j] < alpha)
  7.   cat(namelist[j], "and", namelist[i], "are significantly correlated,
  8.   the correlation coefficient is", x[j, i], "\n")
  9. }
  10. }
复制代码

12
danbaidong 学生认证  发表于 2013-6-12 23:35:51
Ben910128 发表于 2013-6-12 17:37
我明白楼主要做一件什么事情了。我觉得楼主是不是在处理基于相关系数的变量分类问题是产生的这个想法?不 ...
多谢老兄回复!我试着运行了一下,确实可以出来我想要的结果。不过还有两点不明,提出来供商讨:
首先是第09行,为什么要把输入的矩阵转化为数据框呢?
其次是,老兄这里使用的R自带的cor()函数来实现相关系数的计算,但是这个函数只能返回变量的相关系数,并不能对相关性是否具有统计意义进行假设检验(也就是不能返回p-value)。从网上查到ltm包中的rcor.test函数可以同时计算相关系数和p-value,分别在输出的矩阵的上三角和下三角表示,所以我最初的想法就是首先判断p-value是否小于0.1,如果是的话,那就认为是显著相关的,然后再按照我上面提到的格式输出。我在实现的过程中,就发现rcor.test的返回值的类型是“rcor.test”(用class()函数判断),而且也没有办法转化成矩阵或者数据框等类型,不知道你是否遇到过类似的情况?谢谢

13
Ben910128 发表于 2013-6-12 23:49:12
danbaidong 发表于 2013-6-12 23:35
多谢老兄回复!我试着运行了一下,确实可以出来我想要的结果。不过还有两点不明,提出来供商讨:
首先是 ...
1-关于转换为data.frame的问题。因为我发现转换为数据框之后,names()函数才有用,并且能解决这个问题,所以我就转换了。当然我本人也觉得这不是一个好方法,但是个方法。哈哈~
2-p-value直接用cor.test()函数就可以得到了,我没有用过rcor.test()所以我也不是很清楚你说的那个情况。
我是个新手,接触R才一个星期,所以很多问题我也是很模糊的。刚刚看到楼上的哥们给出他的方法,你要不试试?

14
danbaidong 学生认证  发表于 2013-6-13 00:51:37
hugebear 发表于 2013-6-12 22:55
I am sorry I am at school so I can't use Chinese. Actually, you don't need to convert the matrix int ...
多谢仁兄!
不过ltm包中的rcor.test函数的返回值类型是rcor.test类型,而非矩阵或者数据框,也就是说根本原因还是在rcor.test函数本身。

15
hugebear 发表于 2013-6-13 02:16:58 来自手机
danbaidong 发表于 2013-6-13 00:51
多谢仁兄!
不过ltm包中的rcor.test函数的返回值类型是rcor.test类型,而非矩阵或者数据框,也就是说根本 ...
自己转换一下就好,思想已经都写给你了。要学会灵活变通。

16
hugebear 发表于 2013-6-13 07:11:53
好吧,对于你这个具体问题,就再给一个程序吧。
注意虽然R的class千变万化,但本质上都是list, 要学会用unclass来查看庙里面究竟住了什么和尚。
  1. result <- rcor.test(testdata)
  2. result1 <- unclass(result)
  3. cor.mat <- result1$cor.mat
  4. p.val <- result1$p.values  #print them and check their classes!
  5. #Although result$cor.mat and result$p.values also give the identical results,
  6. #I recommend first use unclass(result) to see what happened.

  7. #The following function will display the output you wish, x is the correlation matrix, y
  8. #is a matrix gives p-values.
  9. display.correlation <- function(x, y, alpha = 0.05) {
  10. namelist <- colnames(x)
  11. for(i in 1:nrow(y))
  12. {
  13.   if(y[i, 3] < alpha)
  14.   cat(namelist[y[i, 1]], "and", namelist[y[i, 2]], "are significantly correlated,
  15.   the correlation coefficient is", x[namelist[y[i, 1]], namelist[y[i, 2]]], "\n")
  16. }
  17. }

  18. display.correlation(cor.mat, p.val)
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
danbaidong + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

17
danbaidong 学生认证  发表于 2013-6-13 08:32:18
hugebear 发表于 2013-6-13 07:11
好吧,对于你这个具体问题,就再给一个程序吧。
注意虽然R的class千变万化,但本质上都是list, 要学会用un ...
多谢老兄了,你这可是点出了我学习的一个盲点,呵呵,费心了哈,多谢!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 07:13