【问题标题】:Limit on the Number of Variables for bestglm Functionbestglm 函数的变量数限制
【发布时间】:2021-02-27 03:55:28
【问题描述】:

我正在尝试在 R 中运行 bestglm 函数以进行子集选择,如果我在函数中使用超过 15 个变量,则运行会立即失败。我在下面附上了一些示例代码(我知道这些模型对于这个数据集有太多的变量,我只是在这里包括这些模型作为示例):

cars.df = data.frame(mtcars)
cars.df
resp.var = cars.df$mpg

ind.matrix.15 = model.matrix(mpg ~ disp + hp + drat + wt + qsec + vs + am + gear + carb + disp:wt + drat:wt + qsec:am + gear:hp + cyl:disp + drat:gear, data = cars.df)[, -1]
matrix.xy.15 = data.frame(ind.matrix.15, y = as.matrix(resp.var))
bestglm(Xy = matrix.xy.15, family = gaussian(link = 'log'), nvmax = 15)

ind.matrix.16 = model.matrix(mpg ~ disp + hp + drat + wt + qsec + vs + am + gear + carb + disp:wt + drat:wt + qsec:am + gear:hp + cyl:disp + drat:gear + disp:hp, data = cars.df)[, -1]
matrix.xy.16 = data.frame(ind.matrix.16, y = as.matrix(resp.var))
bestglm(Xy = matrix.xy.16, family = gaussian(link = 'log'), nvmax = 16)

第一个 bestglm 函数运行良好,但是当我为总共 16 个功能添加一个附加变量时,第二个 bestglm 函数立即产生以下错误消息:p = 16. must be <= 15 for GLM.

method 参数更改为更简单的算法,例如backward,而不是默认的exhaustive,并不会消除错误。

这只是 bestglm 函数的限制,还是我可以更改一个参数以允许超过 15 个功能。

【问题讨论】:

  • 错误消息表明您可以将 15 个术语放入 bestglm (here)。我想知道RequireFullEnumerationQ 会发生什么变化...
  • 有趣,感谢您链接代码。如果family = gaussian、没有超过 2 个级别的因子和RequireFullEnumerationQ = FALSE(默认),则看起来代码默认为跳跃库。如果其中任何一个为假,那么无论method != exhaustive 是否存在,该函数似乎都需要15 个或更少的变量。这是相当不幸的,但我想这只是功能的限制。

标签: r regression glm


【解决方案1】:

正如@RomanLuštrik 所说,这是hard-coded constraint in bestglm,大概是因为15 个预测变量意味着有2^15 = 32768 个候选模型,并且必须在某个地方停下来......据我所知,没有办法运行 GLM 时的此约束。 (Roman 对RequireFullEnumerationQ=FALSE 的建议不起作用,因为越界算法仅适用于线性模型,不适用于 GLM。)

一种可能的策略(此处未完全探讨)是用跳跃式详尽地拟合线性模型,保存大量顶级模型(例如TopModels=1000),然后重新评估顶级模型您首选的方差结构...这不能直接在leaps 中工作,但可以按如下方式进行破解:

leaps.obj <- leaps:::leaps.setup(matrix.xy.16,y=cars.df$mpg,nvmax=16,
       nbest=10000)
bb <- leaps:::leaps.exhaustive(leaps.obj, really.big=TRUE)

但我不知道(而且似乎需要做很多工作)弄清楚如何使用对数链接高斯重新评估这些模型。

您也许可以让glmulti 包工作(它提供了用于完整枚举的method="h" 和用于遗传算法的method="g"),但到目前为止我还没有设法克服一些Java 错误。 ..

不幸的是,J Stat Software article describing glmulti 表明此方法具有一些相同的约束:

为了提高性能,Java 类将公式编码为紧凑的位字符串。目前,两个整数(每个 32 位)用于主效应,两个长整数(128 位)用于每个类别的交互项(因子:因子、协变量:协变量和因子:协变量)来编码模型。这意味着最多可以有 32 个因子和 32 个协变量,如果包括交互作用,每个类别最多可以有 128 个交互作用。如果 x 是因子的数量,y 是协变量的数量,则后一个约束条件是:
x y xy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2018-09-24
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多