lm() 用 group_by 和 R- 混淆的 spss 用户保存残差

lm() saving residuals with group_by with R- confused spss user

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

假设我正在处理在重复测量实验中收集的 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)

我可以应用一个公式(Mark 和 Daniel 解决方案的混合)来计算 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)

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

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

这returns函数的标准化残差。要将它们绑定到变量,您可以执行以下操作:

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

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

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

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

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

那么,残差应该已经在正确的尺度上了。此外,如果您使用 z 分数,您可能 应该 在该比例上绘制。我实际上不确定 运行 z 分数作为响应对你有什么好处——似乎你会失去关于组间差异程度的信息。

也就是说,如果组很紧凑,但它们之间的差异因主题而异,则 z 分数可能始终将它们显示为相似数量的 z 分数。例如,假设您有两个科目,一个在条件 A 上得分为 (1,1,1),在条件 B 上得分为 (3,3,3),第二个科目得分为 (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))