0

我想使用 dredge::MuMIn 来探索我的数据。如果I(GISalt^2)变量和GISalt.

例如,我想保留:

(GISalt * Forest) AND (I(GISalt^2) * Forest)
mod1 <- glm(MLE2017 ~ MLE200405 + (GISalt * Forest) + Scrub + I(GISalt^2) * Forest)

(GISalt * Forest) but NOT I(GISalt^2) * Forest)
mod2 <- glm(MLE2017 ~ MLE200405 + (GISalt * Forest) + Scrub)

并排除:

I(GISalt^2) * Forest) 但不是 GISalt * Forest) mod3 <- glm(MLE2017 ~ MLE200405 + Scrub + I(GISalt^2) * Forest)

包含所有变量的全局模型dredge()

globmod <- glm(MLE2017 ~ MLE200405 + GISalt * Forest + GISalt * Scrub 
    + GISalt * Meadow + GISalt * RiverLgthm + GISalt * DailySunHrs  + 
    I(GISalt^2) * Forest + I(GISalt^2) * Scrub + I(GISalt^2) * Meadow +
    I(GISalt^2) * RiverLgthm + I(GISalt^2) * DailySunHrs, 
    data = GLMdata, family = x.quasipoisson(link = "log"))
4

1 回答 1

1

您需要一个形式的表达式,dc(I(A^2):B, A:B)或者更明确地!{I(A^2):B} || {A:B}说,即“没有A^2 * BA * B ”或(请注意,A*B在 R 公式中是 的简写A+B+A:B,其中A:B是实际的交互项)。没有现成的方法dredge可以将 B 扩展为“任何其他变量”,但您可以为术语列表生成合适的表达式。

如果通用表达式是!{I(A^2):VARIABLE} || {A:VARIABLE},您可以substitute很好地使用,将名称VARIABLE替换为实际的变量名称。

substitute((!{I(A^2):VARIABLE} || {A:VARIABLE}), list(VARIABLE = as.name("B")))

产量!{I(A^2):B} || {A:B}。使用运算符为每个“其他变量”创建这样的表达式&&。将所有内容包装在一个函数中:

makeRule <- function(...) {
    exprList <- lapply(sys.call()[-1], function(x) substitute((! {I(A^2):VAR} || {A:VAR}), list(VAR = x)))
    rval <- exprList[[1]]
    for(x in exprList[-1]) rval <- call("&&", rval, x)
    rval
}

然后:

 subsetExpr <- makeRule(B,C,D,E)

 dredge(model, subset = subsetExpr)
于 2018-01-13T21:42:16.650 回答