R 多个测试
我想对以下格式的数据执行多个测试 第一列是“id” 使用值(例如)1,1,1,2,2,2 第二栏是“比率” 值为0.2、0.18、0.3、1.5、1.4、1.6 对于“id”的每个实例,我想根据数据帧中的所有比率值测试所有比率值 现在我有这个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
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")