我尝试在全局模型上使用MuMIn::dredge(),在给定某些标准的情况下,给出我的候选模型。我读过?dredge并理解了其中的一些内容,但对于如何包含我的标准之一,我仍然有一些疑问:
如果我有一个全局模型。
y ~ X1 + X2 + X3 + X4 + X5 + X6 + X7 + X1:X2 + X2:X3 + X3:X4 + X4:X6 + X5:X7(几个主要影响和几个交互)--我只想说明一下,我只想一次返回包含一个交互的模型,我如何以一种简单的方式对其进行子集?
此外,如果全局模型还包括参数的二次多项式
Y ~ X1 + X1^2 + X2 + X3 + X4我想明确指出,这两者应该始终存在于模型中(主要效果X1从来没有没有X1^2),我理解这个语法是(同意吗?):
dredge(global.model, subset=(X1^2|!X1))如果我的理解是正确的,那么dredge()正在处理相反的问题(只有当X1在模型中时,X1^2才会在模型中发生--对于在没有主要效果的情况下永远不会发生的交互)?
但是dredge()内部的二次多项式的语法是怎样的呢?我说得对吗?就像这样:
dredge(global.model, subset=({I(X1^2)}|!X1))发布于 2018-02-28 16:37:08
这不是一个最优雅的解决方案,但它有效:
library(MuMIn)
# example global model with many interactions:
fm <- lm(y ~ (X1 + X2 + X3 + X4)^2, Cement, na.action = na.fail)
# create a vector of interaction term names:
x <- c(getAllTerms(fm))
x <- x[grep(":", x)] # won't work if any variable name has ":" in it.
# create a subset expression (sum of interactions < N):
ss <- substitute(sum(X) < N, list(N = 3, X = as.call(lapply(c("c", x), as.symbol))))
# the resulting expression is:
sum(c(`X1:X2`, `X1:X3`, `X1:X4`, `X2:X3`, `X2:X4`, `X3:X4`)) < 3
dd <- dredge(fm, subset = ss)
# verify:
max(rowSums(!is.na(dd[, x]))) # --> 2编辑:更好的交互检测,并封装到函数中:
subsetExprInteractionLimit <- function(model, N = 1) {
x <- getAllTerms(model)
x <- c(x)[attr(x, "order")][attr(terms(model), "order") > 1]
substitute(sum(X) <= N, list(N = N, X = as.call(lapply(c("c", x), as.symbol))))
}
subsetExprInteractionLimit(fm, N = 1) # limit to 1 interactionhttps://stackoverflow.com/questions/49030121
复制相似问题