r中数据帧子集的t.tests循环
我有一个数据框'math.numeric',包含32个变量。每行代表一个学生,每个变量是一个属性。根据学生的期末成绩,他们被分为5组 数据如下:r中数据帧子集的t.tests循环,r,loops,subset,p-value,R,Loops,Subset,P Value,我有一个数据框'math.numeric',包含32个变量。每行代表一个学生,每个变量是一个属性。根据学生的期末成绩,他们被分为5组 数据如下: head(math.numeric) school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason ... group 1 1 18 2 1 1 4 4 1 5 1 2 1 1
head(math.numeric)
school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason ... group
1 1 18 2 1 1 4 4 1 5 1 2
1 1 17 2 1 2 1 1 1 3 1 2
1 1 15 2 2 2 1 1 1 3 3 3
1 1 15 2 1 2 4 2 2 4 2 4
1 1 16 2 1 2 3 3 3 3 2 3
1 2 16 2 2 2 4 3 4 3 4 4
我对第1组和所有其他组的每个变量进行t检验,以确定该组显著不同的属性。我希望得出每个测试的p值,例如:
t.test(subset(math.numeric$school, math.numeric$group == 1),
subset(math.numeric$school, math.numeric$group != 1))$p.value
t.test(subset(math.numeric$sex, math.numeric$group == 1),
subset(math.numeric$sex, math.numeric$group != 1))$p.value
t.test(subset(math.numeric$age, math.numeric$group == 1),
subset(math.numeric$age, math.numeric$group != 1))$p.value
我一直在试图找出如何创建一个循环来完成这项工作,而不是一次编写一个测试。我尝试了一个for循环和lappy,但到目前为止我没有任何运气
我对这方面还不太熟悉,所以任何帮助都将不胜感激
考特尼这是怎么回事
pvals <- numeric() #the vector of p values
k <- 1 #in case you choose to use a subset not continuing from 1
# "for(i in seq(1,5))" is just doing the pvalues for the first 5 columns. You could do a
# list, like "c(1,2,4)" (in place of "seq(1,5)"), to do tests for columns 1, 2, and 4.
# To do all of the columns, try "for(i in seq(1,(ncol(math.numeric)-1)))".
for(i in seq(1,5)){
# using your code to grab the p-values and store them in the kth element of "pvals"
pvals[k] <- t.test(subset(math.numeric[,i], math.numeric$group == 1),
subset(math.numeric[,i], math.numeric$group != 1))$p.value
#iterating the "pvals" vector entry counter
k=k+1
}
pvals #printing the p values for each test
pvals您的示例数据不足以实际对所有子组进行t检验。出于这个原因,我使用了iris
数据集,其中包含3种植物:刚毛、杂色和维吉尼亚。这些是我的小组。您必须相应地调整代码。下面我将展示如何测试一个组与所有其他组、一个组与另一个组以及各个组的所有组合
一组与所有其他组的组合:
首先,让我们假设我想比较Versicolor和Virginica与Setosa,即Setosa是我的组1
,所有其他组都应该与之进行比较。实现您想要的目标的简单方法如下:
sapply(names(iris)[-ncol(iris)], function(x){
t.test(iris[iris$Species=="setosa", x],
iris[iris$Species!="setosa", x])$p.value
})
Sepal.Length Sepal.Width Petal.Length Petal.Width
7.709331e-32 1.035396e-13 1.746188e-69 1.347804e-60
smalln <- data.frame(a=1, b=2)
t.test(smalln$a, smalln$b)
> Error in t.test.default(smalln$a, smalln$b) : not enough 'x' observations
failproof.t <- failwith(default="Some default of your liking", t.test, quiet = T)
failproof.t(smalln$a, smalln$b)
[1] "Some default of your liking"
在这里,我提供了数据集中不同变量的名称names(iris)
,包括指示分组变量[-ncol(iris)]
(因为它是最后一列)的列,作为sapply
的向量,它将相应的名称作为参数传递给我定义的函数
一组与其他各组的比较:
如果要对所有组进行分组比较,以下内容可能会有所帮助:首先,创建一个包含所有要执行的组x变量组合的数据框,当然不包括分组变量本身和引用组。这可以通过以下方式实现:
comps <- expand.grid(unique(iris$Species)[-1], # excluding Setosa as reference group
names(iris)[-ncol(iris)] # excluding group column
)
head(comps)
Var1 Var2
1 versicolor Sepal.Length
2 virginica Sepal.Length
3 versicolor Sepal.Width
4 virginica Sepal.Width
5 versicolor Petal.Length
6 virginica Petal.Length
其中,组1 aka Setosa在函数中硬编码。这为我提供了一个数据框,其中包含所有组合的p值(Setosa作为参考组),以便轻松查找:
head(comps)
Var1 Var2 pval
1 versicolor Sepal.Length 3.746743e-17
2 virginica Sepal.Length 3.966867e-25
3 versicolor Sepal.Width 2.484228e-15
4 virginica Sepal.Width 4.570771e-09
5 versicolor Petal.Length 9.934433e-46
6 virginica Petal.Length 9.269628e-50
所有组的组合:
您可以轻松地展开上述内容,以生成一个数据帧,其中包含每个组组合的t-tests的p值。一种办法是:
comps <- expand.grid(unique(iris$Species), unique(iris$Species), names(iris)[-ncol(iris)])
您可以使用它来执行测试:
comps$pval <- apply(comps, 1, function(x) {
t.test(iris[iris$Species==x[1], x[3]], iris[iris$Species==x[2], x[3]])$p.value
} )
这样,每当t.test
抛出一个错误时,您就会得到一个字符作为结果,并且计算将继续与其他组进行。不用说,您还可以将default
设置为一个数字或其他任何内容。它不一定是一个角色
统计免责声明:
说到这里,请注意进行几个t检验并不一定是好的统计实践。您可能希望调整p值以考虑多个测试,或者您可能希望使用进行联合测试的替代测试程序 考虑按组拆分数据帧,并跨列使用mapply()
。输出成为测试统计信息的编译列表:统计信息、参数、p值、confid。间隔等
# FILTER ROWS AND SUBSET NUMERIC COLS
group1df <- df[df$group==1, 1:ncol(df)-1]
othgroupdf <- df[df$group!=1, 1:ncol(df)-1]
# T-TEST FCT
tfct <- function(v1, v2){
t.test(v1, v2)
}
# RUN T-TESTS BY COL, SAVE RESULTS TO LIST
ttests <- mapply(tfct, group1df, othgroupdf)
#筛选行和子集数字列
group1df您应该包括示例数据,以解决您的问题并使其更容易帮助您。
smalln <- data.frame(a=1, b=2)
t.test(smalln$a, smalln$b)
> Error in t.test.default(smalln$a, smalln$b) : not enough 'x' observations
failproof.t <- failwith(default="Some default of your liking", t.test, quiet = T)
failproof.t(smalln$a, smalln$b)
[1] "Some default of your liking"
# FILTER ROWS AND SUBSET NUMERIC COLS
group1df <- df[df$group==1, 1:ncol(df)-1]
othgroupdf <- df[df$group!=1, 1:ncol(df)-1]
# T-TEST FCT
tfct <- function(v1, v2){
t.test(v1, v2)
}
# RUN T-TESTS BY COL, SAVE RESULTS TO LIST
ttests <- mapply(tfct, group1df, othgroupdf)