使用挖泥机内的粘贴创建逻辑语句

时间:2014-12-15 22:42:55

标签: r

我正在尝试使用包含二次项的模型的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)

如果有人可以请第二行帮助我,我们将不胜感激。谢谢

3 个答案:

答案 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一起使用的子集表达式。