R 多个测试

R 多个测试,r,t-test,R,T Test,我想对以下格式的数据执行多个测试 第一列是“id” 使用值(例如)1,1,1,2,2,2 第二栏是“比率” 值为0.2、0.18、0.3、1.5、1.4、1.6 对于“id”的每个实例,我想根据数据帧中的所有比率值测试所有比率值 现在我有这个 data <- read.delim("clipboard", stringsAsFactors=FALSE) ##data to test dist <- as.numeric(readClipboard()) ##distribution

我想对以下格式的数据执行多个测试

第一列是“id” 使用值(例如)1,1,1,2,2,2

第二栏是“比率” 值为0.2、0.18、0.3、1.5、1.4、1.6

对于“id”的每个实例,我想根据数据帧中的所有比率值测试所有比率值

现在我有这个

data <- read.delim("clipboard", stringsAsFactors=FALSE) ##data to test
dist <- as.numeric(readClipboard()) ##distribution to test against


data$Ratio.Mean.H.L <- NA
data$p.value <- NA


for (i in 1:nrow(data))
     if (nrow(data) > 1)
 {
 #welsh t-test
 t.test.result <- t.test(data$ratio[i],dist,
                         alternative = "two.sided",
                         mu = 0, 
                         paired = FALSE, 
                         var.equal = FALSE,
                         conf.level = 0.95)     
 #writes data into the data.frame
 data$p.value[i] <- t.test.result$p.value
 }

write.table(data, file="C:/R_Temp/t-test.txt", sep = "\t")

data我怀疑MattParker的评论将是这里最重要的事情:你将单个数字与向量进行比较,而
t.test
会对此抱怨。由于您建议要对每个分组变量(
id
)执行测试,因此在base R中,您可能希望使用类似于
by
(或
split
)的函数。(在
dplyr
data.table
中也有很好的方法。)

使用
mtcars
作为示例数据,我将尝试模拟您的数据:

dat <- mtcars[c("cyl", "mpg")]
colnames(dat) <- c("id", "ratio")
现在您可以执行以下操作:

by(dat$ratio, dat$id, function(x) t.test(x, dist, paired = FALSE)$p.value)
# dat$id: 4
# [1] 2.660716e-10
# ------------------------------------------------------------ 
# dat$id: 6
# [1] 4.826322e-09
# ------------------------------------------------------------ 
# dat$id: 8
# [1] 2.367184e-07
如果您希望/需要一次处理的不仅仅是
比率
,您也可以这样做:

by(dat, dat$id, function(x) t.test(x$ratio, dist, paired = FALSE)$p.value)
# dat$id: 4
# [1] 2.660716e-10
# ------------------------------------------------------------ 
# dat$id: 6
# [1] 4.826322e-09
# ------------------------------------------------------------ 
# dat$id: 8
# [1] 2.367184e-07
调用
by
的结果是一个class
“by”
,它实际上只是一个重新打包的
列表,带有一些额外的属性:

res <- by(dat, dat$id, function(x) t.test(x$ratio, dist, paired = FALSE)$p.value)
class(res)
# [1] "by"
str(attributes(res))
# List of 4
#  $ dim     : int 3
#  $ dimnames:List of 1
#   ..$ dat$id: chr [1:3] "4" "6" "8"
#  $ call    : language by.data.frame(data = dat, INDICES = dat$id, FUN = function(x) t.test(x$ratio,      dist, paired = FALSE)$p.value)
#  $ class   : chr "by"
(请注意,
dat$id
的不同级别是整数4、6和8,因此
名称应与您的
$id
相对应)

编辑

如果要在data.frame中显示结果,请考虑两个选项:

  • 对每一行重复p值,导致大量重复。我不鼓励这种方法有几个原因;如果您在某个时候需要它,我建议使用选项2,然后使用
    merge
  • 生成一个data.frame,其行数与唯一的
    id
    行数相同。比如:

    do.call(rbind.data.frame,
            by(dat, dat$id, function(x) list(id=x$id[1], pv=t.test(x, dist, paired=F)$p.value)))
    #   id           pv
    # 4  4 1.319941e-03
    # 6  6 2.877065e-03
    # 8  8 6.670216e-05
    

  • 好的,很抱歉这个定义不明确的问题。我在其他地方得到了帮助,并将发布为感兴趣的人工作的脚本。我想计算蛋白质组学实验中比率变化的p值。为此,我对任何给定蛋白质或PTM位点的所有比率测量值进行单独的t检验。这些测量值与所有测量值的中位数(t.检验函数中的μ)或测量值的整个分布进行比较。在一列中,我有每个条目唯一的“id”,在另一列中,我有“值”(比率)。我将对所有出现的“值”与任何给定的唯一“id”进行t检验。为了便于使用,我将表粘贴到脚本中,而不是从文件中调用它(这为我节省了一个步骤)


    数据,而不是描述数据的外观,然后使用
    read.delim(“剪贴板”)
    ,您能给我们一个示例data.frame吗?这不是为了帮助你我们可以复制的东西。嗯。。。如果我理解正确,您希望将单个数字(
    data$ratio[I]
    )与值向量(
    dist
    )进行比较。但是t检验是用来比较两组数字的——将一个数字与一组数字进行比较不会得到有意义的结果。你想在这里回答什么问题?
    通过(mtcars$mpg,mtcars$cyl,function(x)t.test(x,dist,paired=F,var.equal=F)$p.value)
    ?好的,我认为有一些误解。让我们以mtcars数据帧为例。如果我们使用“cyl”=“id”和“mpg”=“ratio”。我想对每个id的所有传动比进行t检验,在其他OWRD中,比较一辆4缸汽车的所有MPG。在mt车中有11辆4缸车。因此,t检验将把这11个mpg测量值与我提供的分布“dist”进行比较。虽然没有完成,但点击了return-这是我第一次在这里发布。在我的数据中,我有数千个t-测试要执行,有些“id”只出现一次,所以它们应该被排除在t-测试之外。理想情况下,我会将这些结果写入一个文本文件。“排除在t检验之外”表示简单的过滤,例如
    if(length(x)>1)…
    。“到文本文件”:
    writeLines
    write.csv
    ?我正在慢慢地到达那里。这是有效的
    res[[1]]
    # [1] 2.660716e-10
    as.numeric(res)
    # [1] 2.660716e-10 4.826322e-09 2.367184e-07
    names(res)
    # [1] "4" "6" "8"
    
    do.call(rbind.data.frame,
            by(dat, dat$id, function(x) list(id=x$id[1], pv=t.test(x, dist, paired=F)$p.value)))
    #   id           pv
    # 4  4 1.319941e-03
    # 6  6 2.877065e-03
    # 8  8 6.670216e-05
    
    data <- read.delim("clipboard", stringsAsFactors=FALSE) ##data to test(two columns "id" and "value") Log-transfrom ratios!!
    summary(data)
    
    med <- median(data$value)
    
    
    # function for the id-grouped t-test 
    calc_id_ttest <- function(d) #col1: id, col2:values
      {  
    colnames(d) <- c("id", "value")  # reassign the column names
    
    # calculate the number of values for each id
    res_N <- as.data.frame(tapply(d$value, d$id, length)) 
    colnames(res_N) <- "N"              
    res_N$id <- row.names(res_N)
    
    # calculate the number of values for each id
    res_med <- as.data.frame(tapply(d$value, d$id, median)) 
    colnames(res_med) <- "med"              
    res_med$id <- row.names(res_med)
    
    # calculate the pvalues 
    res_pval <- as.data.frame(tapply(d$value, d$id, function(x)
    {
      if(length(x) < 3) 
        {   # t test requires at least 3 samples
        NA
        } 
      else
        {
        t.test(x, mu=med)$p.value #t.test (Pearson)d$value with other distribution? alternative=less or greater
        }                         #d$value to compare with entire distribution
                                  #mu=med for median of values for 1-sided test
    }))
    
    colnames(res_pval) <- "pval"  # nominal p value 
    res_pval$id <- row.names(res_pval)
    res_pval$adj.pval <- p.adjust(res_pval$pval, method = "BH")  #multiple testing correction also "bonferroni"
    
    res <- Reduce(function(x,y)
    {
    merge(x,y, by = "id", all = TRUE)
    }, 
    list(res_N, res_med, res_pval))
    return (res)
    }
    
    data_result <- calc_id_ttest(d = data)
    write.table(data_result, file="C:/R_Temp/t-test.txt", quote = FALSE, row.names = FALSE, col.names = TRUE, sep = "\t")