【问题标题】:How to do 1000 permutations of column names with test statistics distribution?如何使用测试统计分布对列名进行 1000 次排列?
【发布时间】:2020-05-20 18:21:11
【问题描述】:

假设我有一个这样的矩阵

dat <- read.table(text = "   code.1 code.2 code.3 code.4
1     82     93     NA     NA
2     15     85     93     NA
3     93     89     NA     NA
4     81     NA     NA     NA",
                  header = TRUE, stringsAsFactors = FALSE)
dat2=data.matrix(dat)

实际上,我的矩阵有 132 列和大约 15000 行。 我的列名如下所示:NoD_14569_norm.1 NoD_14569_norm.2 NoD_14569_norm.3 NoD_14581_30mM.1 NoD_14581_30mM.2 NoD_14581_30mM.3

我想要做的是为我的列名创建 1000 个随机排列,其中矩阵中的所有内容都将保持不变,除非会有新的列名顺序。

例如,列名的一种排列/改组会给我这个:

  code.2 code.4 code.1 code.3
1     82     93     NA     NA
2     15     85     93     NA
3     93     89     NA     NA
4     81     NA     NA     NA

目标是对 1000 个数据帧中的每一个执行以下代码

subject="all_replicate"
targets<-readTargets(paste(PhenotypeDir,"hg_sg_",subject,"_target.txt", sep=''))
Treat <- factor(targets$Treatment,levels=c("C","T"))
Replicates <- factor(targets$rep)
design <- model.matrix(~Replicates+Treat)
corfit <- duplicateCorrelation(dat2, block = targets$Subject)
corfit$consensus.correlation
fit <-lmFit(dat2,design,block=targets$Subject,correlation=corfit$consensus.correlation)
fit<-eBayes(fit)
y1=topTable(fit, coef="TreatT", n=nrow(genes),adjust.method="BH",genelist=genes)

在 y1 内部有包含 p 值的列名 P.value,我想绘制所有上述 1000 个列名排列的分布。

请指教

【问题讨论】:

  • 通过“列名的新顺序”,你的意思是dat2[,sample(ncol(dat2))]吗?还是你的意思是colnames(dat2) &lt;- sample(colnames(dat2))
  • 感谢您的意见,我更新了我的问题以准确反映我的意思
  • 我可能不应该称它为排列,而只是列名的改组

标签: r permutation


【解决方案1】:

列名的随机排序很简单:

set.seed(42)
# manyorders <- replicate(1000, sample(colnames(dat2)), simplify=FALSE)
# set.seed(42)
manyorders <- replicate(1000, sample(colnames(dat2)), simplify=FALSE)
head(manyorders)
# [[1]]
# [1] "code.4" "code.3" "code.1" "code.2"
# [[2]]
# [1] "code.3" "code.2" "code.4" "code.1"
# [[3]]
# [1] "code.3" "code.4" "code.1" "code.2"
# [[4]]
# [1] "code.4" "code.1" "code.3" "code.2"
# [[5]]
# [1] "code.4" "code.1" "code.3" "code.2"
# [[6]]
# [1] "code.4" "code.1" "code.2" "code.3"

从这里,您可以执行以下操作之一:

### 1, rename-in-copy
for (ord in manyorders) {
  tmpdat <- `colnames<-`(dat2, ord) # copies and renames in one line ... code-golf
  # ... your code
}

### 2, rename in place
for (ord in manyorders) {
  colnames(dat2) <- ord
  # ... your code
}

### 3, lapply, effectively rename-in-copy
all_results <- lapply(manyorders, function(ord) {
  tmpdat <- `colnames<-`(dat2, ord) # copies and renames in one line ... code-golf
  # ... your code, ending in ...
  fit <- eBayes(fit)
  y1 <- topTable(fit, coef="TreatT", n=nrow(genes), adjust.method="BH", genelist=genes)
  list(fit = fit, y1 = y1)
})

最后一个允许您查看任何运行的fity1 组件,以高效的方式生成。

【讨论】:

  • 您好,我正在运行您提供的具有 100 个排列的第三个版本,并且我将 all_results 写入了一个文件。但后来当我试图在 R > a=read.table("all_res", header=T) 中打开该文件时 read.table("all_res", header = T) 中的错误:列多于列名
  • 您是如何将all_results 写入文件的?它是什么样子的?我没想到它看起来像data.frame,所以我不希望它可以用read.table 轻松阅读。 (不过,这是一个不同的问题,因此最好使用dput(all_results[1:2]) 提出一个新问题以及如何保存到文件。)
  • 谢谢!这就是我保存它的方式: write.table(all_results, file="all_res", sep = " ", row.names = FALSE, col.names = TRUE,quote=FALSE)
  • 如果您想保存结果并在以后重复使用,我建议使用savesaveRDS,因为它们会保留您可能需要的结构和属性。否则,请打开一个新问题,这与您当前的问题不同。
猜你喜欢
  • 2021-05-04
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 2020-09-22
  • 2023-03-04
  • 2022-09-29
相关资源
最近更新 更多