2016-04-17 7 views
0

Я совершенно новичок в программировании и R, но имею набор данных, которые могут быть проанализированы только с помощью более мощной программы статистики, такой как R.Как провести тест против одной назначенной контрольной группы в R?

У меня есть большой, но простой набор данных, состоящий из тысяч различных групп с несколькими образцы, которые я хочу сравнить с контрольной группой с помощью теста mann whitney U, структура данных приведена ниже.

Group, Measurements 
a  0.14534 
cont 0.42574 
d  0.36347 
c  0.14284 
a  0.23593 
d  0.36347 
cont 0.33514 
cont 0.29210 
b  0.36345 
... 

Проблема заключается в том, что характер испытания требует наличия только двух групп. Однако, поскольку у меня более одной группы, это не работает.

Это то, что у меня есть до сих пор, и я, как вы видите, не работает многократно и работает только в том случае, если у меня есть две группы в моем исходном файле.

data1 = read.csv(file.choose(), header=TRUE, stringsAsFactors=FALSE) 
attach(data1) 
testoutput <- wilcox.test(group ~ measurement, mu=0, alt="two.sided", conf.int=TRUE, conf.level=0.95, paired=FALSE, exact=FALSE, correct=TRUE) 
write.table(testoutput$p.value, file="mwUtest.tsv", sep="\t") 

Как мне написать и проверить цикл для проверки всех моих групп против моей назначенной контрольной группы? Я предполагаю, что функции sapply или lapply используются до wilcox.test, но я не знаю, как это сделать.

Прошу прощения, если этот простой вопрос был поднят раньше, но я не мог найти никакого предыдущего вопроса относительно этой конкретной проблемы.

+0

Похоже, у вас есть запятую в качестве десятичного разделителя - если это так добавить 'сен =», "' на ваш 'read.csv'. Попробуйте 'pairwise.wilcox.test', если вы хотите попарно тесты wilcoxon, или kruskal.test –

+0

Ах, извините, я просто составил эти цифры на ходу, и я обычно использую десятичные знаки как разделители, поскольку я грязный евро, данные в лист отформатирован правильно, и я отредактировал свой пост, чтобы отразить это. Спасибо хоть! –

+0

Я понимаю, что вы новичок в R, но слово совета от кого-то, кто был там: не используйте attach. Не привыкнуть к использованию, потому что это загромождает вашу среду и может привести к странным проблемам/ошибкам, которые трудно отлаживать. – Heroka

ответ

0

В R часто бывает много решений по той же проблеме. Вот как я это разрешу.

Во-первых, я хотел бы разделить мои данные и один dataframe с экспериментами и один с элементами управления:

experiments <- dat[dat$group!="cont",] 
controls <- dat[dat$group=="cont",] 

Тогда я бы разделить свои экспериментальные данные по группе, и кормить, что мой тест вместе со своими контрольными измерениями , Обратите внимание, что эта конструкция упрощает извлечение большего количества значений из теста: просто верните (именованный) вектор.

result <- lapply(split(experiments, experiments$group),function(x){ 
    mytest = wilcox.test(x$measurement,controls$measurement,mu=0, alt="two.sided", conf.int=TRUE, conf.level=0.95, paired=FALSE, exact=FALSE, correct=TRUE) 
    return(mytest$p.value) 
}) 

Объединяя к столу затем легко:

output <- do.call(rbind,result) 

данных:

set.seed(123) 
nobs=100 
dat <- data.frame(group=sample(c(LETTERS[1:6],"cont"),nobs,T), 
        measurement=runif(nobs),stringsAsFactors=F) 
+0

Большое спасибо за хороший ответ! Ваше решение отлично работало для решения моей проблемы и было именно тем, что я искал. Хотя у меня были некоторые проблемы с его тестированием, так как тест не понравился пустой записи, но это было удивительно легко исправить в R даже для новичков (для других новичков R с той же проблемой это было так: http: // stackoverflow .com/вопросы/4862178/удалить-строка-с NAS-в-данными-кадр). –