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
使用 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 分数可能始终将它们显示为相似数量的 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))
这是对我的原始问题的完整重新编辑
假设我正在处理在重复测量实验中收集的 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
使用 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 分数可能始终将它们显示为相似数量的 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))