我的数据由59个变量(列)和500个观察值(每个参与者)组成。我必须将一项(列)与其余项(所有其他列)建立关联。
我在其他列的第一列中做了这个,但是我想在for循环中重复该操作。
我尝试过:
sapply(mydata[-1],function(y)cor.test(mydata$First_Item,y)$p.value)
但是,如果我要在第一列的第二列和其他3:59处执行此操作,则它将无效。
我想要这样的东西:
for (i in 1:59){
sapply(mydata[,i],function(y)cor.test(mydata[,i],y)$p.value)
}
非常感谢!
编辑:
B1_TP_CO_9999_01 = c(1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1)
B1_TP_CO_9999_02 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
B1_TP_CO_9999_03 = c(2, 0, 0, 2, 2, 2, 2, 2, 0, 1, 0, 2, 2, 2, 0)
B1_TP_CO_9999_04 = c(0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0)
B1_TP_CO_9999_05 = c(0, 2, 2, 2, 0, 0, 2, 2, 0, 0.5, 0, 0, 2, 1, 0)
答案 0 :(得分:0)
?cor
函数将很快创建关联矩阵。但是,如果您想要一个自定义函数(例如,使p值变得容易),请尝试执行双循环。不是最快的,但非常简单。
mydata <- matrix(runif(200),20,10)
p <- ncol(mydata)
cor_pval <- function(x, y) cor.test(x, y)$p.value
m <- matrix(0, p, p)
for (i in 1:ncol(mydata)) {
for (j in 1:ncol(mydata)) {
m[i,j] = cor_pval(mydata[,i], mydata[,j])
}
}
这是蛮力的。如果您不需要此功能,则不需要它,但是它使更改度量标准变得容易。同样,也可以从j
开始i+1
,而不用重复第二循环中的每一列,以免重复计算。但是,这应该可以得到结果,并且您可以在找出循环时从那里进行调整。
在这里,它也像您正在使用的那样具有apply函数。如果要将结果重新构建到矩阵中,则需要将i=j
循环中向量for
的位置插入0。
m2 <- matrix(0, p, p)
for (i in 1:p) {
m2[i, ] = append(apply(mydata[,-i], 2, cor_pval, y = mydata[,i]), 0, after = i - 1)
}
all.equal(m, m2)
[1] TRUE
答案 1 :(得分:0)
我们可以使用expand.grid()
来避免嵌套循环。
n <- ncol(mydata)
ex <- t(expand.grid(1:n, 1:n)) # transpose with `t()`
myCor <- function(x) cor.test(x[, 1], x[, 2])$p.value # test fun
现在,我们运行一个sapply()
,并将结果打包到具有正确暗号的矩阵中。
MX <- matrix(sapply(seq(ncol(ex)), function(i) myCor(mydata[ex[, i]])),
ncol=n, dimnames=rep(list(names(mydata)), 2))
产量:
MX <- round(MX, 3)
> MX
B1_TP_CO_9999_01 B1_TP_CO_9999_02 B1_TP_CO_9999_03 B1_TP_CO_9999_04 B1_TP_CO_9999_05
B1_TP_CO_9999_01 0.000 NA 0.043 1.000 0.757
B1_TP_CO_9999_02 NA NA NA NA NA
B1_TP_CO_9999_03 0.043 NA 0.000 0.857 0.703
B1_TP_CO_9999_04 1.000 NA 0.857 0.000 0.164
B1_TP_CO_9999_05 0.757 NA 0.703 0.164 0.000
一个测试显示我们正在工作:
> cor.test(mydata[, 1], mydata[, 3])$p.value
[1] 0.04325627
> cor.test(mydata[, 4], mydata[, 3])$p.value
[1] 0.8574056
> cor.test(mydata[, 4], mydata[, 5])$p.value
[1] 0.164388
如果我们想摆脱上面的三角形,我们最终可以做到
MX[upper.tri(MX, diag=TRUE)] <- ""
导致:
> as.data.frame(MX)[-n]
B1_TP_CO_9999_01 B1_TP_CO_9999_02 B1_TP_CO_9999_03 B1_TP_CO_9999_04
B1_TP_CO_9999_01
B1_TP_CO_9999_02 <NA>
B1_TP_CO_9999_03 0.043 <NA>
B1_TP_CO_9999_04 1 <NA> 0.857
B1_TP_CO_9999_05 0.757 <NA> 0.703 0.164
注意:警告来自您的数据,您也可以测试代码,例如与mydata <- iris[-5]
。
数据
mydata <- structure(list(B1_TP_CO_9999_01 = c(1, 0, 0, 0, 0, 1, 1, 1, 0,
1, 0, 1, 1, 1, 1), B1_TP_CO_9999_02 = c(1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1), B1_TP_CO_9999_03 = c(2, 0, 0, 2, 2,
2, 2, 2, 0, 1, 0, 2, 2, 2, 0), B1_TP_CO_9999_04 = c(0, 1, 1,
0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0), B1_TP_CO_9999_05 = c(0,
2, 2, 2, 0, 0, 2, 2, 0, 0.5, 0, 0, 2, 1, 0)), class = "data.frame", row.names = c(NA,
-15L))