2013-10-07 2 views
4

У меня есть некоторые данные, содержащие групповую переменную (0/1) и индивидуальную оценку для примерно 2000 человек. Набор данных выглядит примерно так:Перемешать данные перед выполнением glm, а затем повторить x раз

ID group score 
A1 1 3.5 
A2 1 3.2 
A3 0 2.8 
A4 0 2.5 

Я хочу, чтобы проверить, если переменная группа может быть предсказана через счет, и использовали следующее: R:

glm(group~score,family=binomial) 

Теперь я хотел бы проверьте мое значение p, перетасовывая групповую переменную, затем снова выполняя glm. Я хотел бы сделать это как минимум 10 000 раз и, возможно, больше, каждый раз при печати значения p для оценки в файле, так что есть одна строка на каждую перестановку. Я посмотрел на sample(), но я стараюсь объединить это с glm() и как вывести только p-значение. В скрипте/формуле я хотел бы легко изменить количество перестановок, а также изменить формулу glm, если я захочу добавить ковариаты.

Благодарим за помощь!

+1

тасовани часть 'данных $ группа <- выборка (данные $ группа, N, замените = FALSE)', где 'N' является 'nrow (data)'. Тем не менее, я настоятельно рекомендую вам ознакомиться с «уровнями доверия», после чего вы почти наверняка сможете сократить ваши 10 000 проб до более удобного количества. –

+0

Спасибо! Это похоже на то, что я пробовал, только это работает! Насколько я понимаю, число перестановок должно быть в порядке величины p-значения, чтобы тщательно протестировать его, поэтому, если p-значение составляет 10^-5, мне нужны 10^5 перестановок. Будет читать больше, хотя. – user2854461

+1

Предположительно, вы имеете в виду 'group ~ score'. У вас, кажется, хороший размер выборки - любая конкретная причина, по которой вы хотите выполнить тест перестановки, а не тест отношения правдоподобия через 'anova'? Для теста перестановки вы можете попробовать пакет 'glmperm' на CRAN. –

ответ

3

Вы на правильном пути.

Пример (я добавил еще одно значение для подавления предупреждений о «подогнанных вероятностей численно 0 или 1»)

ex <- read.table(textConnection(
"ID group score 
A1 1 3.5 
A2 1 3.2 
A3 0 2.8 
A4 0 2.5 
A5 1 2.4"),header=TRUE) 

g0 <- glm(group~score,data=ex,family=binomial) 

Теперь вам нужна функция для вычисления сводную р-значение (вы можете сделать это на муха в replicate, но таким образом чистый).

pvalfun <- function() { 
    g <- update(g0,data=transform(ex,group=sample(group))) 
    coef(summary(g))["score","Pr(>|z|)"] 
} 
res <- replicate(1000,pvalfun()) 

Или

library(plyr) 
res <- raply(1000,pvalfun(),.progress="text") 

Или

library(glmperm) 
ptest2 <- prr.test(group~score,"score",data=ex,family=binomial) 
summary(ptest2) 
+0

Привет, это группа, которую мне нужно переставить, а не оценку. Я думаю, что я подавляю следующее: 'out <-replicate (N, summary (glm (sample (data $ group) ~ data $ score, family = binomial)) $ coef, "PR (> | z |)"]) ' Теперь моя единственная задача - вычислительная мощность, выход на другой компьютер ... – user2854461

+0

В этом случае не имеет значения, перепутаете ли вы группу или партитуру, если они скремблированы относительно друг друга - вы должны получить одинаковые результаты. Обратите внимание на приведенные выше комментарии, которые показывают, что в этом конкретном примере перестановка очень маловероятна, чтобы дать вам ответы, отличные от стандартного подхода GLM (тест отношения правдоподобия) - он просто сгорит намного больше времени на компьютере! 'glmperm :: prr.test' также, вероятно, намного эффективнее, чем передискретизация грубой силы ... –

+0

Если я это правильно понимаю, я не смогу добавить ковариаты значимым образом, если я скрою счет, так как некоторые из ковариатов исправляют изменения в оценке из-за отсутствия данных. – user2854461

Смежные вопросы