使用来自 emmeans::ref_grid 的两个变量的组合重建参考网格

Posted

技术标签:

【中文标题】使用来自 emmeans::ref_grid 的两个变量的组合重建参考网格【英文标题】:Reconstruct a reference grid with the combination of two variables from emmeans::ref_grid 【发布时间】:2021-10-19 00:08:14 【问题描述】:

我的真实数据与emmeans:MOats 想要传达的想法具有相似的复杂性。我使用MOats作为练习示例。

library(emmeans)


MOats.lm = lm(yield ~ Block + Variety, data = MOats)
    ref_grid(MOats.lm)
'emmGrid' object with variables:
    Block = VI, V, III, IV, II, I
    Variety = Golden Rain, Marvellous, Victory
    rep.meas = multivariate response levels: 0, 0.2, 0.4, 0.6
    # Silly illustration of how to use 'mult.levs' to make comb's of two factors
    ref_grid(MOats.lm, mult.levs = list(T=LETTERS[1:2], U=letters[1:2]))

假设MOats.lm中的Block因子不是实验设计中流行的阻塞因子,而是Oat的一个特性。

主要问题:我想从VarietyBlock 的组合中创建一个新变量,称为eateradd_grouping 语法,这样如果Variety = Golden Rain x Block = I 然后eater = fox,如果Variety = Golden Rain x Block = II然后eater = fox,如果Variety = Marvellous x Block = II然后eater = cat,等等,组成12个组合(12个是任意的,有些动物吃的品种多,有些只吃一个)。我想我需要创建一个Block x Variety 的虚拟变量,然后分配所需的eater。最后,我想对每个品种的食客进行对比。

eater <- factor(c("fox", "cat","mouse","frog"), levels = c("fox", "cat","frog", "mouse"))

我该如何进行? add_grouping 示例仅具有单因素重建。如果Block 的级别不能被Variety 的级别整除怎么办?例如,Block 有 9 个级别,Variety 有 4 个级别。https://rdrr.io/cran/emmeans/man/add_grouping.html

fiber.lm <- lm(strength ~ diameter + machine, data = fiber)
( frg <- ref_grid(fiber.lm) )

# Suppose the machines are two different brands
brands <- factor(c("FiberPro", "FiberPro", "Acme"), levels = c("FiberPro", "Acme"))
( gfrg <- add_grouping(frg, "brand", "machine", brands) )

附带问题:rep.meas = multivariate response levels: 0, 0.2, 0.4, 0.6 来自哪里? View(MOats)中没有这个栏目。

我还没有弄清楚如何从https://rdrr.io/github/rvlenth/emmeans/src/R/ref-grid.R 的源代码中以 Factor1 = Factor2*Factor3 的形式构造一个新变量。非常感谢任何潜在客户。

更新:以下行添加了新的分组变量,但删除了原始分组变量 VarietyBlock

eater <- rep(LETTERS[1:3],6)
RG_add2 <- add_grouping(RG, "eater", "BV", eater)
RG_add2
'emmGrid' object with variables:
    BV = 6 G, 5 G, 3 G, 4 G, 2 G, 1 G, 6 M, 5 M, 3 M, 4 M, 2 M, 1 M, 6 V, 5 V, 3 V, 4 V, 2 V, 1 V
    rep.meas = multivariate response levels: 0.0, 0.2, 0.4, 0.6
    eater = A, B, C
Nesting structure:  BV %in% eater


RG_add <- add_grouping(RG, "eater", "BVlev", eater)  
Error in add_grouping(RG, "eater", "BVlev", eater) : 
  Length of 'newlevs' doesn't match # levels of 'BVlev'

我不明白这个错误,因为

length(BV)
[1] 18
 length(eater)
[1] 18
BV
 [1] "6 G" "5 G" "3 G" "4 G" "2 G" "1 G" "6 M" "5 M" "3 M" "4 M" "2 M" "1 M"
[13] "6 V" "5 V" "3 V" "4 V" "2 V" "1 V"
BVlev
 [1] "6 G" "5 G" "3 G" "4 G" "2 G" "1 G" "6 M" "5 M" "3 M" "4 M" "2 M" "1 M"
[13] "6 V" "5 V" "3 V" "4 V" "2 V" "1 V"

最后,我想做emmeans(RG_add, ~ Variety|eater)

【问题讨论】:

我还没有完全理解主要问题,但附带问题很容易。 MOats 有一个多变量响应变量,rep.meas 是多变量响应水平的名称——如文档所述。 谢谢,直到我str(MOats) 才看到氮含量。 View(MOats) 没有给我全套。 【参考方案1】:

add_grouping() 函数当前需要一个嵌套因子。所以你需要创造一个因素。这可以使用levels&lt;- 方法完成:

library(emmeans)
MOats.lm = lm(yield ~ Block + Variety, data = MOats)

RG = ref_grid(MOats.lm)
RG
## 'emmGrid' object with variables:
##     Block = VI, V, III, IV, II, I
##     Variety = Golden Rain, Marvellous, Victory
##     rep.meas = multivariate response levels: 0, 0.2, 0.4, 0.6

BVlev = do.call(paste, expand.grid(c(6, 5, 3, 4, 2, 1), c("G", "M", "V")))

levels(RG) = list(BV = BVlev, rep.meas = c(0, 0.2, 0.4, 0.6))
RG
## 'emmGrid' object with variables:
##     BV = 6 G, 5 G, 3 G, 4 G, 2 G, 1 G, 6 M, 5 M, 3 M, 4 M, 2 M, 1 M, 6 V, 5 V, 3 V, 4 V, 2 V, 1 V
##     rep.meas = multivariate response levels: 0.0, 0.2, 0.4, 0.6

由reprex package (v2.0.0) 于 2021-08-17 创建

现在您可以继续使用add_grouping(RG, "eater", "VB", eaters)eaters 的长度必须为 18,这样每个元素都指定与 BV 的每个级别关联的食者。

在替换级别时,您需要注意保留级别列表中因素的相对顺序。组合的因素需要是连续的。

【讨论】:

我在更新我的问题后看到了你的回答。我会回来报告的。 糟糕,我需要对答案进行一些小的更正。等等…… 谢谢。为什么 nitro 变量从 View(MOats) “隐藏”?如果不是,levels(RG) = list(BV = BVlev, rep.meas = c(0, 0.2, 0.4, 0.6)) 中的 rep.meas 对我来说会更有意义。 我不知道,因为我从未使用过 View。但是如果你帮助它不会被隐藏(“MOats”) 请参阅 emmeans 存储库上的 this issue。我扩展了add_grouping() 以支持多个参考因素。但要小心你想要什么。如果您想要比较Variety|eater,您将获得Block 的平均值,并且您只能在所有 6 个街区都有相同的食客的情况下获得估计。 很好地工作的是比较食客。您可以从 GitHub 安装修改后的包,然后查看 add_grouping 的新示例。

以上是关于使用来自 emmeans::ref_grid 的两个变量的组合重建参考网格的主要内容,如果未能解决你的问题,请参考以下文章

如何对来自不同表MySQL的两列求和

来自通用模型定义的两种语言的 ORM 实体类生成器

来自seaborn facetgrid中不同数据帧的两行

连接来自两个不同表的两列

比较来自两个不同表的两列的逗号分隔值

如何合并来自上下文相关的两列的数据?