-1

这是我原始问题的完整重新编辑

假设我正在处理在重复测量实验中收集的 RT 数据。作为我日常工作的一部分,我总是将 RT 转换为自然对数,然后计算每个参与者中每个 RT 的 Z 分数,以调整试验次数。这通常通过 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)

结果值清楚地表明分组尚未开始。知道为什么没有成功吗?

4

2 回答 2

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
于 2016-10-14T12:58:29.620 回答
1

使用dplyrand magrittr,您应该能够使用此代码计算个人内部的 z 分数(它将事物分成您告诉它的组,然后在该组内计算)。

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

然后你应该能够在你的模型中使用它。但是,可能有助于您转向 R 思维的一件事是,您可以直接构建模型,而不必提前制作所有这些列。例如,使用lme4tosubject视为随机变量:

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

然后,残差应该已经在正确的范围内。此外,如果您使用 z 分数,您可能应该在该比例上进行绘图。我实际上不确定使用 z 分数运行什么作为响应可以获得你 - 似乎你会丢失有关组之间差异程度的信息。

也就是说,如果组很紧密,但它们之间的差异因主题而异,z 分数可能总是将它们显示为相似数量的 z 分数。例如,假设您有两门科目,一门在条件 A 上得分 (1,1,1),在条件 B 上得分 (3,3,3),第二个科目在条件 A 上得分 (1,1,1) 和 ( 5,5,5) - 两者都会给出 (-.9,-.9,-.9) 与 (.9,.9,.9) 的 z 分数 - 失去 A 和之间差异的信息B 在主题 2 中较大。

但是,如果您真的想转换回来,您可以使用它来存储主题均值和 sds,然后将残差乘以subjSD并添加subjMean

experiment %<>%
  group_by(subject) %>%
  mutate(rtLN = log(rt)
         , ZRE1 = scale(rtLN)
         , subjMean = mean(rtLN)
         , subjSD = sd(rtLN))
于 2016-10-14T15:00:28.850 回答