首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >疏浚子集交互数(MuMIn)

疏浚子集交互数(MuMIn)
EN

Stack Overflow用户
提问于 2018-02-28 12:55:38
回答 1查看 1.1K关注 0票数 1

我尝试在全局模型上使用MuMIn::dredge(),在给定某些标准的情况下,给出我的候选模型。我读过?dredge并理解了其中的一些内容,但对于如何包含我的标准之一,我仍然有一些疑问:

如果我有一个全局模型。

代码语言:javascript
复制
y ~ X1 + X2 + X3 + X4 + X5 + X6 + X7 + X1:X2 + X2:X3 + X3:X4 + X4:X6 + X5:X7

(几个主要影响和几个交互)--我只想说明一下,我只想一次返回包含一个交互的模型,我如何以一种简单的方式对其进行子集?

此外,如果全局模型还包括参数的二次多项式

代码语言:javascript
复制
Y ~ X1 + X1^2 + X2 + X3 + X4

我想明确指出,这两者应该始终存在于模型中(主要效果X1从来没有没有X1^2),我理解这个语法是(同意吗?):

代码语言:javascript
复制
dredge(global.model, subset=(X1^2|!X1))

如果我的理解是正确的,那么dredge()正在处理相反的问题(只有当X1在模型中时,X1^2才会在模型中发生--对于在没有主要效果的情况下永远不会发生的交互)?

但是dredge()内部的二次多项式的语法是怎样的呢?我说得对吗?就像这样:

代码语言:javascript
复制
dredge(global.model, subset=({I(X1^2)}|!X1))
EN

回答 1

Stack Overflow用户

发布于 2018-02-28 16:37:08

这不是一个最优雅的解决方案,但它有效:

代码语言:javascript
复制
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

编辑:更好的交互检测,并封装到函数中:

代码语言:javascript
复制
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 interaction
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49030121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档