尝试在dplyr :: do内部构建模型,然后在同一dplyr :: do调用中提取coef(model)。

3

我正在尝试为一组标准曲线建立一系列线性模型。

目前,以下代码可以生成我想要的输出(每个线性模型的截距和斜率):

slopes <- STANDARDS %>% group_by(plate, col, row, conc_ug_mL) %>% do(
    #model = lm(value ~ variable, data = .),
    intercept = coef(lm(value ~ variable, data = .))[1],
    slope = coef(lm(value ~ variable, data = .))[2])

但是我不得不注释掉模型行并调用lm两次。我真的很想把它做成这样:

slopes2 <- STANDARDS %>% group_by(plate, col, row, conc_ug_mL) %>% do(
    model = lm(value ~ variable, data = .),
    intercept = coef(.$model)[1],
    slope = coef(.$model)[2])

第二块代码不会引发错误,但对截距和斜率都返回NULL。我认为我的问题在于不理解dplyr::do中的参考结构。 但是我只是在学习dplyr,并不确定如何做到这一点。谢谢。

欢迎来到SO。您的问题无法重现,请参阅此FAQ获取更多信息。此外,这篇博客文章broom包可能会有所帮助。 - JasonAizkalns
这里可能会用到 broom 包。 - erc
感谢@JasonAizkalns。我会确保我的未来帖子符合社区的可重现性指南。我很感激推荐的broom包,我将开始使用它来有益地格式化我的dplyr输出! - Nate
谢谢你也推荐扫帚!@beetroot - Nate
1个回答

2
我们不需要 .$model。使用可重复的示例。
 data(mtcars)
 mtcars %>%
   group_by(cyl) %>% 
   do({model = lm(wt~gear, data=.)
   data.frame(intercept= coef(model)[1], slope=coef(model)[2])})
 #    cyl intercept      slope
 # (dbl)     (dbl)      (dbl)
 #1     4  3.829406 -0.3773438
 #2     6  4.180750 -0.2757500
 #3     8  5.205208 -0.3670417

感谢您的解决方案,很抱歉我的示例无法重现。您能解释一下“{”的意义吗?当我尝试用“(”替换“{”时,会返回错误。是“{”只定义了一个未命名的函数吗? - Nate
@NathanDay 这是为了分隔多行。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接