繁体   English   中英

在group_by()中的mutate()内的lm()

[英]lm() within mutate() in group_by()

我正在寻找一种方法来向我的数据表添加一个列,该列包含来自lm(a~b)函数的residuals ,该函数分别针对不同的c级别计算

我被建议调查sort_by(c)函数,但这似乎不适用于lm(a~b)

我的工作示例数据如下所示:

结果数据框架

列subject,trial和rt都在data.frame ,我的目标是计算Zre_SPSS (我最初在SPSS中制作)但是来自R函数。

我试过了

data %<>% group_by (subject) %>% 
  mutate(Zre=residuals(lm(log(rt)~trial)))

但它不起作用 - Zre得到计算但不是分别在每个主题内,而是整个数据框。

有人可以帮我吗? 我是一个完整的R(和一般的编码)新手,所以请原谅我,如果这个问题是愚蠢的或重复的 ,我很可能不理解其他解决方案或他们找不到解决方案。 最好的祝福。

根据Ben Bolker的要求,这里是R代码,用于从excel屏幕截图生成数据

#generate data
  subject<-c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3)
  subject<-factor(subject)
  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)

#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)

#make data frame
  sym<-data.frame(subject, trial, rt, ZreSPSS)

它看起来像dplyr 0.5的mutate一个bug,其中组内的lm仍然会尝试使用完整的数据集。 您可以使用do代替:

sym %>% group_by(subject) %>% do(
{
    r <- resid(lm(log(rt) ~ trial, data = .))
    data.frame(., r)
})

这仍然与您的SPSS列不匹配,但它是您给出的数据的正确结果。 您可以通过手动为每个主题拟合模型并检查残差来验证这一点。

(其他类型的残差包括rstandard用于标准化和rstudent用于学生化残差。它们仍然不符合您的SPSS数字,但可能是您正在寻找的。)

更高版本的dplyr似乎能够处理这个问题(用dplyr 0.7.4测试):

sym %>% group_by(subject) %>% do(
{
    r <- resid(lm(log(rt) ~ trial, data = .))
    data.frame(., r)
}) ->a

sym %>% group_by(subject) %>% mutate(

    r =  resid(lm(log(rt) ~ trial))
) ->b

all(a$r==b$r)  #->TRUE

另一项独立测试

# https://stackoverflow.com/a/40061201/2292993
# https://stackoverflow.com/q/24766450/2292993
# https://github.com/tidyverse/dplyr/issues/2177

# tested with dplyr 0.7.4

# 1) do 
df = group_by(iris,Species) %>% do({
res = resid( lm(Sepal.Length~Petal.Length+Petal.Width, data=.) )
data.frame(., res)
})

# 2) group_by + mutate
# cannot have "data=." in lm
df2 = group_by(iris,Species) %>% mutate(
res = resid( lm(Sepal.Length~Petal.Length+Petal.Width) )
)

# 3) filter + mutate
df3 = filter(iris,Species=='setosa') %>% mutate(
res = resid( lm(Sepal.Length~Petal.Length+Petal.Width, data=.) )
)
df3 = bind_rows(df3,
filter(iris,Species=='versicolor') %>% mutate(
res = resid( lm(Sepal.Length~Petal.Length+Petal.Width, data=.) )
))
df3 = bind_rows(df3,
filter(iris,Species=='virginica') %>% mutate(
res = resid( lm(Sepal.Length~Petal.Length+Petal.Width, data=.) )
))

# 4) across all rows (should not be the same)
df4 = mutate(iris,
res = resid( lm(Sepal.Length~Petal.Length+Petal.Width, data=iris) )
)

# conclusion: all the same, except df4
all(df$res==df2$res)
all(df$res==df3$res)
df$res==df4$res

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM