2016-10-14 7 views
-1

Это полный Пересоздать моего Orignal вопрослм() сохранение остатков с group_by с R- спутать SPSS пользователя

Давайте предположим, что я работаю на данных RT, собранных в повторном эксперименте меры. В рамках моей обычной программы я всегда преобразовываю RT в естественные логарифмы, а затем вычисляю оценку Z для каждого RT в пределах каждой корректирующей части для пробного номера. Обычно это делается с помощью простой регрессии в синтаксисе SPSS:

split file by subject. 

REGRESSION 
    /MISSING LISTWISE 
    /STATISTICS COEFF OUTS R ANOVA 
    /CRITERIA=PIN(.05) POUT(.10) 
    /NOORIGIN 
    /DEPENDENT rtLN 
    /METHOD=ENTER trial 
    /SAVE ZRESID. 

split file off. 

Чтобы воспроизвести ту же самую процедуру в R генерировать данные:

#load libraries 
library(dplyr); library(magrittr) 

#generate data 
    ob<-c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3) 
    ob<-factor(ob) 
    trial<-c(1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6) 
    rt<-c(300,305,290,315,320,320,350,355,330,365,370,370,560,565,570,575,560,570) 
    cond<-c("first","first","first","snd","snd","snd","first","first","first","snd","snd","snd","first","first","first","snd","snd","snd") 

    #Following variable is what I would get after using SPSS code 
    ZreSPSS<-c(0.4207,0.44871,-1.7779,0.47787,0.47958,-0.04897,0.45954,0.45487,-1.7962,0.43034,0.41075,0.0407,-0.6037,0.0113,0.61928,1.22038,-1.32533,0.07806) 

    sym<-data.frame(ob, trial, rt, cond, ZreSPSS) 

я мог бы применить формулу (смесь Марка и решение Даниила) для вычисления остатки из lm(log(rt)~trial) регрессию, но по какой-то причине group_by не работает здесь

sym %<>% 
    group_by (ob) %>% 
    mutate(z=residuals(lm(log(rt)~trial)), 
    obM=mean(rt), obSd=sd(rt), zRev=z*obSd+obM) 

Полученные значения четко показывают, что г rouping не зацепил. Любая идея, почему это не сработало?

+0

Можете ли вы разместить пример набора данных? Примеры работы, которую вы проделали до сих пор, помогут вам рассказать людям, какая помощь вам нужна. См. [Здесь] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) для получения дополнительной информации о том, как задавать хорошие вопросы R. –

+0

Mark, ive переписал мой оригинальный вопрос, чтобы ответить на ваши ответы – blazej

ответ

1

Использование dplyr и magrittr, вы должен иметь возможность вычислять z-баллы внутри человека с этим кодом (он разбивает вещи на группы, о которых вы говорите, затем вычисляет внутри этой группы).

experiment %<>% 
    group_by(subject) %>% 
    mutate(rtLN = log(rt) 
     , ZRE1 = scale(rtLN)) 

Тогда вы должны иметь возможность использовать это в своей модели. Тем не менее, одна вещь, которая может помочь вашему переходу на мышление R, состоит в том, что вы, вероятно, можете построить свою модель напрямую, вместо того, чтобы делать все эти столбцы раньше времени. Например, с помощью lme4 для лечения subject в качестве случайной величины:

withRandVar <- 
    lmer(log(rt) ~ cond + (1|as.factor(subject)) 
     , data = experiment) 

Затем остатки должны быть уже на правильном масштабе. Кроме того, если вы используете z-баллы, вы, вероятно, должны планировать на этой шкале. Я на самом деле не уверен, что работает с z-баллами, так как ваш ответ набирает вас - похоже, вы потеряете информацию о степени разницы между группами.

То есть, если группы плотно, но разница между ними зависит от субъекта, то z-score всегда может показывать их как аналогичное количество z-баллов. Представьте себе, например, что у вас есть два предмета, один баллы (1,1,1) при условии A и (3,3,3) при условии B, а второй субъект, который оценивает (1,1,1) и (5,5,5) - оба будут давать z-баллы (-.9, -. 9, -. 9) vs (.9, .9, .9) - теряя информацию о том, что разница между A и B больше в вопросе 2.

Если вы действительно хотите перевести назад, вы, вероятно, можете использовать это для хранения предметов и sds, затем умножьте остатки на subjSD и добавьте subjMean.

experiment %<>% 
    group_by(subject) %>% 
    mutate(rtLN = log(rt) 
     , ZRE1 = scale(rtLN) 
     , subjMean = mean(rtLN) 
     , subjSD = sd(rtLN)) 
+0

Марк, спасибо. Я проведу ваше решение сегодня вечером. В качестве побочного примечания причина, по которой я действительно хочу конвертировать обратно в msec, такова: я вычисляю z-оценки только потому, что хочу скорректировать то, что консервативные испытания, как правило, замедляют задержку ответа. Я мог бы запускать аналогичные процедуры, регулирующие конечную точку ответа, что почти всегда ускоряет задержки, поскольку ответ более экстремален. Хотя анализ этих значений Z дает более сильные эффекты, средние msec, представленные на графиках, более читабельны (я думаю). – blazej

+0

* последовательный не консервативный, извините. Я набираю с мобильного – blazej

+0

Я пытался использовать ваш код, но не могу заставить его работать для моего примера. Я заменил 'mutate (rtLN = log (rt) , ZRE1 = scale (rtLN))' с чем-то вроде 'mutate (rtLN = log (rt))%>% mutate (ZRE1 = rstandard (lm (rtLN ~ trial))) «Как то, что мне действительно нужно в Zscores, является остатком от регрессии, но R не примет этот синтаксис. Есть ли вероятность, что вы сможете обновить свой ответ в соответствии с этим сценарием? – blazej

1
mylm <- lm(x~y) 
rstandard(mylm) 

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

zresid <- rstandard(mylm) 

Пример:

a<-rnorm(1:10,10) 
b<-rnorm(1:10,10) 
mylm <- lm(a~b) 
mylm.zresid<-rstandard(mylm) 

Смотрите также:

summary(mylm) 

и

mylm$coefficients 
mylm$fitted.values 
mylm$xlevels 
mylm$residuals  
mylm$assign   
mylm$call 
mylm$effects   
mylm$qr    
mylm$terms 
mylm$rank   
mylm$df.residual  
mylm$model 
+0

Спасибо! Это решает первую часть моей проблемы. – blazej

+0

Извините за двойной комментарий - как насчет 2-й части? Как я могу преобразовать эти остатки обратно в их первоначальный масштаб, учитывая, что они вычисляются отдельно для каждого участника – blazej

+0

, пока ваше решение работает вообще, я не могу обойти факт, что мне нужно вычислить остатки для каждого объекта отдельно. В соответствии с вашим примером: add: 'c <-rnorm (1: 2,10)', а затем вычислить 'mylm <- lm (a ~ b) mylm.zresid <-rstandard (mylm)' для каждого уровня c – blazej