Как сделать 1000 перестановок имен столбцов с распределением тестовой статистики? - PullRequest
0 голосов
/ 05 февраля 2020

допустим, у меня есть такая матрица

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 строк. И имена моих столбцов выглядят так: матрица останется прежней, за исключением того, что будет новый порядок имен столбцов.

например, одна перестановка / перестановка имен столбцов даст мне следующее:

  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.value, содержащие значения p, и я хотел бы построить распределение их для всех вышеупомянутых 1000 перестановок имен столбцов.

Пожалуйста, сообщите

1 Ответ

2 голосов
/ 05 февраля 2020

Случайный порядок имен столбцов достаточно прост:

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)
})

Этот последний позволяет вам взглянуть на fit и y1 компонентов для любого прогона, генерируя это эффективным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...