【问题标题】:An equivalent code in R for a "by" statement in SAS, to run multiple ANOVA on different levels of a variableR 中用于 SAS 中“by”语句的等效代码,用于在变量的不同级别上运行多个 ANOVA
【发布时间】:2020-05-27 20:27:50
【问题描述】:

我想按位置运行每个物种总捕获量的线性模型。 数据如下所示:

Location REP TRAP SpeciesID Total
A1 A1_1 A1_1_1 Calaingr 5.288462
A1 A1_1 A1_1_1 Carataed 1.057692
A1 A1_1 A1_1_1 Harpfulv 1.057692
…

模型是一个非常简单的模型: C_AOV

在 SAS 中,我可以使用“by”语句(通过 SpeciesID),​​它会告诉 SAS 为每个 SpeciesID 级别运行模型,因此输出 54 个单独的 ANOVA,每个物种一个。 在 R 中有没有等效的方法来做到这一点?我尝试在网上查找,但没有找到我能理解的方法。我确实看到了 plyr 包和一些示例,但不明白它们的作用。 谢谢, 某人

【问题讨论】:

    标签: r sas


    【解决方案1】:

    我可以为 R 说话,它比 SAS 过程中的 by 语句要冗长一些。通常,范式是拆分、应用、组合。您将至少有以下两个选项。假设您将数据存储为 df 对象。我实际上并没有运行任何代码。

    Tidyverse 和扫帚

    这对于 '%>%' 管道运算符和 tidyverse 术语来说不会那么直观。但是,这可能是执行此操作的更简洁的方法之一。

    # Not run    
    library(tidyverse)
    
    library(broom)
    
    models <- df %>% 
     nest(-SpeciesID) %>% 
     mutate(fit = map(data, ~ lmer(Total~Location + (1|REP), data = .),
            results = map(fit, glance))%>%
     unnest(results)
    
    models %>% select(-fit, -data)
    

    拆分、应用、合并循环

    恕我直言,循环结构使这更容易理解。

    #Not run    
    split <- split(df, SpeciesID)
    
    models <- list()
    
    for (i in 1:length(split)) {
     model_df <- split[[i]]
     models[[i]] <-  lmer(Total~Location + (1|REP), data=model_df)
    }
    
    sapply(1:length(models), function(x) {summary(models[[x]]})
    

    基础 R 应用方法

    这种方法非常简洁,并再次强调了 lmer 函数是如何“应用”在各种数据子集上的。 function(x) 是一个匿名函数,其中 x 是跨 df$SpeciesID 级别的迭代器。

    by(df,df$SpeciesID, function(x) summary(lmer(Total~Location + (1|REP),data = x))) 
    

    *Onyambu评论中的解决方案

    我确信还有其他选择,但我希望这会有所帮助。作为从主要是 SAS 过渡到主要是 R 的人,这无疑是 SAS 使事情变得容易的事情之一。 R 建模函数很少有类似于 SAS by 子句的参数。

    【讨论】:

    • by(df,df$SpeciesID, function(x) summary(lmer(Total~Location + (1|REP),data = x))) in base R
    • Base R 为胜利...!单线也不少。
    • 大家好,感谢您的cmets,非常感谢您的帮助。有趣的是,我在研究生院(很久以前)学习了 SAS,并且相当精通。但是,由于预算限制,我们强烈建议学习 R。对于某些分析,例如物种群落分析、空间分析等,我非常喜欢 R 平台和该领域其他人提交的软件包。我在 R 中发现有些困难的是数据转换语法和参数统计......我想我已经习惯了 SAS,以至于我有点迷失了。再次感谢,将尽快尝试,
    • 太棒了。我还在学校学习了 SAS(计量经济学),在了解 R 之后,我更喜欢它来处理数据,除了 SAS 更强大的非常大的数据集。请考虑将答案标记为正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    相关资源
    最近更新 更多