我在医疗保健工作,我需要有关如何使用R的帮助 我解释一下:我有一组这样的数据:
S1 S2 S3 S4 S5
0.498 1.48 1.43 0.536 0.548
2.03 1.7 3.74 2.13 2.02
0.272 0.242 0.989 0.534 0.787
0.986 2.03 2.53 1.65 2.31
0.307 0.934 0.633 0.36 0.281
0.78 0.76 0.706 0.81 1.11
0.829 2.03 0.667 1.48 1.42
0.497 1.27 0.952 1.23 1.73
0.553 0.286 0.513 0.422 0.573
以下是我的目标:
Do correlation between every column
Calculate p-values
Calculate R-squared
Only show when R2>0.5 and p-values <0.05
到目前为止,这是我的代码(它不是效率最高但是有效):
> e<-read.table(‘Workbook8nm.csv’, header=TRUE, sep=“,”, dec=“.”, na.strings=“NA”)
> f<-data.frame(e)
> M<-cor(f, use=“complete”) #Do the correlation like I want
> library(‘psych’)
> N<-corr.test (f) #Give me p-values
所以,到目前为止,我在M中的相关性和我在N中的p值。 我需要有关如何显示R2的帮助?
第二部分如何制作R仅在R2> 0.5且p值<0.05时才显示?我用过这一行:
P<-M[which(m>0.9))]
仅在皮尔逊系数大于0.9作为训练时向我展示。但它只是让我列出了每个优于0.9的值...所以我不知道这个系数来自哪个列和哪个列。最好的是它会在一个名为column的表中显示重要值,以便我可以轻松识别它们。 我想这样做的原因是因为表格是570乘570,所以我不能查看每个p值,只保留重要值。
我希望我很清楚!这是我在这里的第一篇文章,告诉我是否有任何错误!
感谢您的帮助!
答案 0 :(得分:0)
我确定在R空间的某个地方有一个功能可以更快地完成这项工作,但是我写了一个快速功能,将矩阵扩展为data.frame
,使用&#34;行&#34;和&#34;列&#34;作为列,将值作为第三列。
matrixToFrame <- function(m, name) {
e <- expand.grid(row=rownames(m), col=colnames(m))
e[name] <- as.vector(m)
e
}
我们可以将相关矩阵转换为如下数据框:
> matrixToFrame(cor(f), "cor")
row col cor
1 S1 S1 1.0000000
2 S2 S1 0.5322052
3 S3 S1 0.8573687
4 S4 S1 0.8542438
5 S5 S1 0.6820144
6 S1 S2 0.5322052
....
我们可以合并corr.test
和cor
的结果,因为列匹配
> b <- merge(matrixToFrame(corr.test(a)$p, "p"), matrixToFrame(cor(a), "cor"))
> head(b)
row col p cor
1 S1 S1 0.0000000000 1.0000000
2 S1 S2 0.2743683745 0.5322052
3 S1 S3 0.0281656707 0.8573687
4 S1 S4 0.0281656707 0.8542438
5 S1 S5 0.2134783039 0.6820144
6 S2 S1 0.1402243214 0.5322052
然后我们可以过滤我们想要的元素
> b[b$cor > .5 & b$p > .2,]
row col p cor
2 S1 S2 0.2743684 0.5322052
5 S1 S5 0.2134783 0.6820144
8 S2 S3 0.2743684 0.5356585
10 S2 S5 0.2134783 0.6724486
15 S3 S5 0.2134783 0.6827349
编辑:我找到了R matrix to rownames colnames values,它在matrixToFrame
提供了几次尝试;但是,没有什么比我在这里更优雅的了。
EDIT2:请务必仔细阅读corr.test
的文档 - 看起来不同的信息在上下对角线(?)中编码,因此这里的结果可能具有欺骗性。您可能希望在最终过滤步骤之前使用lower.tri
或upper.tri
进行一些过滤。