这是我的数据集,我是R的新手,我试图为这个数据集编写一个脚本。
R> head(KenTau)
Age CapReg TrSw FeelChk CanSw
1 20 1 0 0 0
2 36 1 0 0 0
3 35 1 3 2 2
4 21 0 0 2 2
5 43 0 0 2 2
6 34 1 0 0 0
我想将TrSw与其余的colmn变量进行比较,即
TrSw Vs Age
TrSw Vs CapReg
TrSw Vs FeelChk
TrSw Vs CanSw
我用这个在R上运行它,我使用这个命令
cor.test(KenTau$Age, KenTau$TrSw, alternative="two.sided", method="kendall")
我也想提取Age和pvalue所以我可以有一个列表,因为我有接近50个变量。
dput()
数据:
KenTau <- structure(list(Age = c(20L, 36L, 35L, 21L, 43L, 34L, 37L, 62L,
54L, 47L, 48L, 45L, 2L, 2L, 2L, 54L, 52L, 40L, 58L, 29L, 27L,
28L, 46L, 35L, 50L, 31L, 48L, 2L, 29L, 54L, 52L, 28L, 28L, 26L,
38L, 59L, 51L, 58L, 39L, 44L, 53L, 2L, 39L, 55L, 48L, 2L, 23L,
51L, 50L, 26L, 28L, 40L, 38L, 61L, 52L, 33L, 2L, 59L, 27L, 45L,
45L, 57L, 66L, 52L, 58L, 34L, 28L, 39L, 48L, 53L, 39L, 46L, 57L,
36L, 25L, 22L, 29L, 46L, 25L, 25L, 35L, 44L, 24L, 26L, 33L, 27L,
41L, 28L, 26L, 32L, 36L, 35L, 32L, 33L, 29L, 29L, 52L, 55L, 23L,
29L, 45L, 26L, 48L, 54L, 50L, 35L, 27L, 39L, 41L, 30L, 30L, 31L,
27L, 28L, 27L, 25L, 34L, 23L, 30L, 34L, 52L, 20L, 31L, 2L, 45L,
34L, 21L, 60L, 34L, 40L, 47L, 30L, 54L, 36L, 32L, 31L, 55L, 57L,
23L, 31L, 26L, 26L, 27L, 19L, 26L, 25L, 37L, 47L, 38L, 38L, 26L,
25L, 41L), CapReg = c(1L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L,
1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L,
0L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L,
1L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L,
0L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L,
1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L,
1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L,
1L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L,
1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
TrSw = c(0L, 0L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L,
1L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L,
0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 0L,
1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
0L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L,
1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L,
1L, 1L, 0L, 3L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 0L,
1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 1L,
1L, 1L, 0L, 1L, 1L, 1L), FeelChk = c(0L, 0L, 2L, 2L, 2L,
0L, 2L, 2L, 2L, 3L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 2L, 0L, 1L,
0L, 1L, 2L, 2L, 1L, 1L, 0L, 2L, 2L, 1L, 2L, 2L, 0L, 1L, 2L,
0L, 1L, 2L, 2L, 3L, 0L, 2L, 1L, 0L, 0L, 2L, 1L, 2L, 2L, 1L,
1L, 0L, 1L, 2L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 3L, 1L, 2L, 1L,
1L, 0L, 0L, 1L, 1L, 1L, 0L, 2L, 3L, 1L, 2L, 2L, 1L, 1L, 0L,
2L, 1L, 0L, 1L, 1L, 0L, 2L, 1L, 1L, 0L, 0L, 0L, 2L, 1L, 2L,
1L, 0L, 0L, 0L, 0L, 2L, 0L, 1L, 0L, 2L, 2L, 2L, 0L, 0L, 2L,
3L, 2L, 0L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 0L, 1L, 2L, 2L,
1L, 1L, 2L, 0L, 3L, 1L, 0L, 1L, 1L, 2L, 2L, 3L, 3L, 1L, 0L,
0L, 2L, 0L, 2L, 2L, 3L, 0L, 1L, 1L, 2L, 0L, 0L, 0L), CanSw = c(0L,
0L, 2L, 2L, 2L, 0L, 2L, 2L, 2L, 1L, 0L, 0L, 1L, 0L, 0L, 0L,
0L, 2L, 2L, 0L, 0L, 0L, 2L, 2L, 0L, 0L, 2L, 2L, 2L, 3L, 2L,
2L, 0L, 0L, 2L, 0L, 0L, 2L, 2L, 1L, 1L, 2L, 0L, 0L, 2L, 2L,
3L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 0L, 1L, 0L, 2L, 1L, 3L, 1L,
0L, 0L, 2L, 0L, 0L, 0L, 2L, 0L, 1L, 1L, 1L, 2L, 0L, 1L, 2L,
2L, 1L, 1L, 0L, 2L, 0L, 0L, 1L, 0L, 0L, 2L, 1L, 0L, 0L, 0L,
0L, 2L, 1L, 2L, 0L, 2L, 2L, 0L, 1L, 2L, 0L, 1L, 0L, 2L, 2L,
2L, 0L, 0L, 2L, 3L, 2L, 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 0L,
0L, 0L, 2L, 2L, 1L, 1L, 2L, 1L, 0L, 0L, 2L, 0L, 1L, 2L, 2L,
1L, 1L, 0L, 0L, 2L, 2L, 0L, 2L, 2L, 3L, 1L, 1L, 0L, 2L, 0L,
2L, 0L)), .Names = c("Age", "CapReg", "TrSw", "FeelChk",
"CanSw"), class = "data.frame", row.names = c(NA, -153L))
答案 0 :(得分:3)
虽然我不相信为50个相关产生p值的统计优点,但对于lapply()
和朋友来说这很容易。
为此,我选择迭代names
KenTau
"TrSw"
的非which()
索引,因为这是您希望与其他所有其他人进行比较的变量。我首先使用R> inds <- which(names(KenTau) != "TrSw")
R> inds
[1] 1 2 4 5
获取这些索引:
lapply()
接下来,我设置了对inds
的调用,我将遍历ind
。我现在需要一个匿名函数,它将索引lapply()
作为第一个参数(这是x
将在每次迭代时传递我的函数),我需要传入数据,我这样做作为参数cor.test()
。我的匿名函数会在您的示例中显示x[, ind]
,但请注意TrSw
如何用于引用我们与lapply()
相关联的当前索引或列。 x
调用的最后一部分称为KenTau
,数据为x
,因此每当您在匿名函数中看到KenTau
时,这实际上是指{的副本{1}}:
cors <- lapply(inds,
function(ind, x) {
cor.test(x[, ind], x[, "TrSw"], alternative="two.sided",
method="kendall")
}, x = KenTau)
在cors
列表中添加一些名称会有所帮助,所以现在就这样做:
names(cors) <- names(KenTau)[inds]
如果我们查看cors
,我们会看到它是一个列表:
R> str(cors, max = 1)
List of 4
$ Age :List of 8
..- attr(*, "class")= chr "htest"
$ CapReg :List of 8
..- attr(*, "class")= chr "htest"
$ FeelChk:List of 8
..- attr(*, "class")= chr "htest"
$ CanSw :List of 8
..- attr(*, "class")= chr "htest"
列表中的每个元素都是类"htest"
的对象,这是cor.test()
返回的对象。有四个这样的对象,因为有四个变量可以与TrSw
进行比较。
您希望提取 p - 值,因此我们需要查看它存储在"htest"
对象中的位置:
R> str(cors[[1]])
List of 8
$ statistic : Named num 1.57
..- attr(*, "names")= chr "z"
$ parameter : NULL
$ p.value : num 0.116
$ estimate : Named num 0.105
..- attr(*, "names")= chr "tau"
$ null.value : Named num 0
..- attr(*, "names")= chr "tau"
$ alternative: chr "two.sided"
$ method : chr "Kendall's rank correlation tau"
$ data.name : chr "x[, ind] and x[, \"TrSw\"]"
- attr(*, "class")= chr "htest"
以上输出显示 p - 值存储在组件p.value
中。要提取所有4个 p 值,我们希望实际上这样做:
res[[i]][["p.value"]]
其中i
依次是cors
的每个元素。为此,我们可以再次使用lapply()
,但sapply()
会将结果简化为我们的向量,在这种情况下更整洁。 sapply()
调用会在每个res[[i]]
转弯时通过我们,因此我们只需要应用[[
函数(是的,它可能看起来不像一个,但它实际上是一个函数; { {1}})。该函数只接受一个参数(在本例中我们可以使用我们想要提取的组件的名称),我将其作为"[["()
传递:
"p.value"
因为我向res <- sapply(cors, `[[`, "p.value")
添加了names
,cors
将返回一个命名向量,其中包含 p - 命名变量an {{ 1}}:
sapply()
如果您想要结果的其他组件,请说出测试统计信息本身,然后将TrSw
替换为您想要的组件名称,例如: R> res
Age CapReg FeelChk CanSw
1.157889e-01 3.920115e-01 2.189736e-04 1.578040e-06
获得肯德尔的Tau。
如果你要为很多变量做这个,那就去看看多个测试并调整 p - 值,因为我不相信你的结果会像50那样有用的相关性。