计算 emmeans 对比度的自定义函数
Custom function to compute contrasts in emmeans
我想在 emmeans 中创建一个自定义对比函数,它可以从输入向量中删除给定的级别列表,并在剩余级别上应用内置对比方法 ("trt.vs.ctrl")。示例数据集可用 here。我正在使用以下 R 代码计算方差分析和 post 临时比较:
options(contrasts=c("contr.sum", "contr.poly"))
my_lm <- lm(D1 ~ C*R, data=df)
Anova(my_lm, type = "III")
#show Interaction effects using emmeans
emmip(my_lm, C ~ R )
emm = emmeans(my_lm, ~ C * R)
emm
contrast(emmeans(my_lm, ~ C * R), "consec", by = "C")
#compare 1st with next 3 groups (how to remove other three levels?)
contrast(emmeans(my_lm, ~ C * R), "trt.vs.ctrl", by = "R")
内置的对比度选项 ("trt.vs.ctrl") 将第一个级别与它后面的所有级别进行比较(C 中有 7 个因子级别,我想删除其中的最后 3 个并计算对比度其余 4). An example is provided in the official documentation 编写自定义对比函数。
skip_comp.emmc <- function(levels, skip = 1, reverse = FALSE) {
if((k <- length(levels)) < skip + 1)
stop("Need at least ", skip + 1, " levels")
coef <- data.frame()
coef <- as.data.frame(lapply(seq_len(k - skip - 1), function(i) {
sgn <- ifelse(reverse, -1, 1)
sgn * c(rep(0, i - 1), 1, rep(0, skip), -1, rep(0, k - i - skip - 1))
}))
names(coef) <- sapply(coef, function(x)
paste(which(x == 1), "-", which(x == -1)))
attr(coef, "adjust") = "fdr" # default adjustment method
coef
}
但是,由于我的理解有限,我不太确定在哪里应用自定义示例所需的修改。有什么想法吗?
这是你以后想做很多次的事情吗?我的猜测不是,你只想这样做一次,或者最多几次;在这种情况下,编写自定义对比函数就太麻烦了。只需获取您需要的对比度系数,并将其用作 contrast
.
中的第二个参数
现在,考虑这些结果:
> con <- emmeans:::trt.vs.ctrl.emmc(1:7)
> con
2 - 1 3 - 1 4 - 1 5 - 1 6 - 1 7 - 1
1 -1 -1 -1 -1 -1 -1
2 1 0 0 0 0 0
3 0 1 0 0 0 0
4 0 0 1 0 0 0
5 0 0 0 1 0 0
6 0 0 0 0 1 0
7 0 0 0 0 0 1
从描述来看,我认为您只需要前 3 组对比度系数。所以使用这些列:
contrast(emm, con[, 1:3], by = "R")
更新
Whosebug 偶尔可以激发开发人员添加软件功能。在这种情况下,我决定向 emmeans 中的大多数内置 .emmc
函数添加一个 exclude
参数可能会有用(除了 poly.emmc()
).这样做相当简单,这些功能现在已包含在 github -- https://github.com/rvlenth/emmeans 的最新推送中。这些功能也将包含在下一次 CRAN 更新中。
我想在 emmeans 中创建一个自定义对比函数,它可以从输入向量中删除给定的级别列表,并在剩余级别上应用内置对比方法 ("trt.vs.ctrl")。示例数据集可用 here。我正在使用以下 R 代码计算方差分析和 post 临时比较:
options(contrasts=c("contr.sum", "contr.poly"))
my_lm <- lm(D1 ~ C*R, data=df)
Anova(my_lm, type = "III")
#show Interaction effects using emmeans
emmip(my_lm, C ~ R )
emm = emmeans(my_lm, ~ C * R)
emm
contrast(emmeans(my_lm, ~ C * R), "consec", by = "C")
#compare 1st with next 3 groups (how to remove other three levels?)
contrast(emmeans(my_lm, ~ C * R), "trt.vs.ctrl", by = "R")
内置的对比度选项 ("trt.vs.ctrl") 将第一个级别与它后面的所有级别进行比较(C 中有 7 个因子级别,我想删除其中的最后 3 个并计算对比度其余 4). An example is provided in the official documentation 编写自定义对比函数。
skip_comp.emmc <- function(levels, skip = 1, reverse = FALSE) {
if((k <- length(levels)) < skip + 1)
stop("Need at least ", skip + 1, " levels")
coef <- data.frame()
coef <- as.data.frame(lapply(seq_len(k - skip - 1), function(i) {
sgn <- ifelse(reverse, -1, 1)
sgn * c(rep(0, i - 1), 1, rep(0, skip), -1, rep(0, k - i - skip - 1))
}))
names(coef) <- sapply(coef, function(x)
paste(which(x == 1), "-", which(x == -1)))
attr(coef, "adjust") = "fdr" # default adjustment method
coef
}
但是,由于我的理解有限,我不太确定在哪里应用自定义示例所需的修改。有什么想法吗?
这是你以后想做很多次的事情吗?我的猜测不是,你只想这样做一次,或者最多几次;在这种情况下,编写自定义对比函数就太麻烦了。只需获取您需要的对比度系数,并将其用作 contrast
.
现在,考虑这些结果:
> con <- emmeans:::trt.vs.ctrl.emmc(1:7)
> con
2 - 1 3 - 1 4 - 1 5 - 1 6 - 1 7 - 1
1 -1 -1 -1 -1 -1 -1
2 1 0 0 0 0 0
3 0 1 0 0 0 0
4 0 0 1 0 0 0
5 0 0 0 1 0 0
6 0 0 0 0 1 0
7 0 0 0 0 0 1
从描述来看,我认为您只需要前 3 组对比度系数。所以使用这些列:
contrast(emm, con[, 1:3], by = "R")
更新
Whosebug 偶尔可以激发开发人员添加软件功能。在这种情况下,我决定向 emmeans 中的大多数内置 .emmc
函数添加一个 exclude
参数可能会有用(除了 poly.emmc()
).这样做相当简单,这些功能现在已包含在 github -- https://github.com/rvlenth/emmeans 的最新推送中。这些功能也将包含在下一次 CRAN 更新中。