我的问题是相关系数的排列。
A<-data.frame(A1=c(1,2,3,4,5),B1=c(6,7,8,9,10),C1=c(11,12,13,14,15 ))
B<-data.frame(A2=c(6,7,7,10,11),B2=c(2,1,3,8,11),C2=c(1,5,16,7,8))
cor(A,B)
# A2 B2 C2
# A1 0.9481224 0.9190183 0.459588
# B1 0.9481224 0.9190183 0.459588
# C1 0.9481224 0.9190183 0.459588
我获得了这种相关性,然后想要进行排列测试以检查相关性是否仍然存在。
我按照以下方式进行了排列:
A<-as.vector(t(A))
B<-as.vector(t(B))
corperm <- function(A,B,1000) {
# n is the number of permutations
# x and y are the vectors to correlate
obs = abs(cor(A,B))
tmp = sapply(1:n,function(z) {abs(cor(sample(A,replace=TRUE),B))})
return(1-sum(obs>tmp)/n)
}
结果是
[1] 0.645
并使用“cor.test”
cor.test(A,B)
Pearson's product-moment correlation
data: A and B
t = 0.4753, df = 13, p-value = 0.6425
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.4089539 0.6026075
sample estimates:
cor
0.1306868
如何绘制绘图或直方图以显示实际相关性和置换数据的置换相关值?
答案 0 :(得分:2)
首先,你不可能完全按照这种方式做到......
> corperm = function(A,B,1000) {
Error: unexpected numeric constant in "corperm = function(A,B,1000"
第三个参数没有名字,但它应该有一个!也许你的意思是
> corperm <- function(A, B, n=1000) {
# etc
然后你需要考虑你想要达到的目标。最初,您有两个包含3个变量的数据集,然后将它们折叠为两个向量,并计算置换向量之间的相关性。它为什么有意义?置换数据集的结构应与原始数据集相同。
obs = abs(cor(A,B))
tmp = sapply(1:n,function(z) {abs(cor(sample(A,replace=TRUE),B))})
return(1-sum(obs>tmp)/n)
为什么在这里使用replace = TRUE?如果您想要引导CI-s,这是有道理的,但(a)最好使用专用功能,例如从引导启动,以及(B)您需要对B执行相同操作,即sample(B,replace = TRUE)。
对于排列测试,您可以在没有替换的情况下进行采样,无论是对A还是B进行采样还是仅对A进行采样都没有区别。
如何获得直方图?那么,hist(tmp)会绘制一个置换值的直方图,而obs是观察到的相关性的绝对值。
HTHAB
(编辑)
corperm <- function(x, y, N=1000, plot=FALSE){
reps <- replicate(N, cor(sample(x), y))
obs <- cor(x,y)
p <- mean(reps > obs) # shortcut for sum(reps > obs)/N
if(plot){
hist(reps)
abline(v=obs, col="red")
}
p
}
现在你可以在一对变量上使用它:
corperm(A[,1], B[,1])
要将其应用于所有对,请使用for
或mapply
。 for
更容易理解,因此我不会坚持使用mapply
来获取所有可能的对。
res <- matrix(NA, nrow=NCOL(A), ncol=NCOL(B))
for(iii in 1:3) for(jjj in 1:3) res[iii,jjj] <- corperm(A[,iii], B[,jjj], plot=FALSE)
rownames(res)<-names(A)
colnames(res) <- names(B)
print(res)
要制作所有直方图,请使用上面的plot = TRUE。
答案 1 :(得分:0)
我认为对两个变体的相关性分析进行置换测试没有多大意义,因为cor.test()
函数提供了“p.value”,它与置换测试具有相同的效果。