我正在尝试使用包含二次项的模型的dredge()
。我知道您必须使用subset
选项。我已经定义了二次项
quadraticTerms = c("lux.mean", "temp.mean")
cand.set <- dredge(model, subset=as.logical(paste("(!",quadraticTerms, "^2|", quadraticTerms,collapse=' & ', ')', sep="")), extra="R^2", REML= FALSE, m.max=10)
我在paste()中创建了一个术语,但它无效。挖泥机在没有粘贴的情况下完成所有操作时都能正常工作,如此
cand.set <- dredge(model, subset=(!lux.mean^2|lux.mean) & (!temp.mean^2|temp.mean), extra="R^2", REML= FALSE, m.max=10)
如果有人可以请第二行帮助我,我们将不胜感激。谢谢
答案 0 :(得分:0)
您可能需要类似
的内容subs <- paste0("(!",quadraticTerms, "^2|", quadraticTerms,collapse=' & ', ')')
model.string <-
sprintf("dredge(model, subset=as.logical(%s), extra='R^2', REML=FALSE, m.max=10)",
subs)
cands <- eval(parse(model.string))
通常eval(parse(...))
是最后的手段 - 它往往是脆弱的 - 但我无法想到更好的方法来做到这一点。查看?dredge
的“子集”部分,似乎可以通过矩阵尝试执行此操作。
答案 1 :(得分:0)
如果他们允许subset=
参数的矩阵语法与表达式语法一样灵活,那将会很好,但似乎并非如此。通常情况下,有一些友好的“标准评估”替代方案可以使用像这样的偷偷摸摸的非标准评估参数,但由于某种原因,软件包作者决定不包含这样的解决方法。
尽管如此,还是有一种公式语法替代方案。您可以使用
构建公式subsetform <- as.formula(paste0("~(!",quadraticTerms, "^2|", quadraticTerms,
collapse=' & ', ')'));
dredge(model, subset=subsetform, extra='R^2', REML=FALSE, m.max=10)
应该与表达式做同样的事情。我用
进行了测试library(MuMIn)
data(Cement)
fm1 <- lm(y ~ ., data = Cement)
dredge(fm1, subset=(!X1|X2) & (!X3|X4))
# same as...
subsetform <- as.formula("~(!X1|X2) & (!X3|X4)")
dredge(fm1, subset=subsetform)
答案 2 :(得分:0)
首先,我认为您的二次项与I(x^2)
而不是x^2
相似。其次,使用dc()
来做这件事可能更简单。
实施例。假设模型是:
fm <- lm(y ~ X1 + I(X1^2) + X2 + I(X2^2), Cement)
v <- c("X1", "X2")
单行与parse
:
ssexpr <- parse(text = paste(sprintf("dc(%1$s, `I(%1$s^2)`)", v), collapse = " && "))
或更长,但没有parse
:
vquadr <- sprintf("I(%s^2)", v)
for(i in seq_along(v)) {
x <- call("dc", as.name(v[i]), as.name(vquadr[i]))
ssexpr <- if(i == 1) x else call("&&", ssexpr, x)
}
ssexpr
是与dredge
一起使用的子集表达式。