r中数据帧子集的t.tests循环

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

我有一个数据框'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   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)