【发布时间】:2021-08-15 16:09:21
【问题描述】:
在 glm 的文档中,有一个 method 选项,在文档中它说
用户提供的拟合函数可以作为函数提供 或命名函数的字符串,其中函数采用 与 glm.fit 相同的论点。如果指定为字符串 从 stats 命名空间中查找。
我想使用二项式非负最小二乘优化器,使系数为非负且总和为 1。使用此优化器的一个示例是在带有选项 method = "method.NNLS" 的 SuperLearner 包中.下面是一个可重现的例子:
library(SuperLearner)
# binary outcome
set.seed(1)
N <- 200
X <- matrix(rnorm(N*10), N, 10)
X <- as.data.frame(X)
Y <- rbinom(N, 1, plogis(.2*X[, 1] + .1*X[, 2] - .2*X[, 3] +
.1*X[, 3]*X[, 4] - .2*abs(X[, 4])))
SL.library <- c("SL.glmnet", "SL.glm", "SL.knn", "SL.mean")
# least squares loss function
test.NNLS <- SuperLearner(Y = Y, X = X, SL.library = SL.library,
verbose = TRUE, method = "method.NNLS", family = binomial())
> test.NNLS
Call:
SuperLearner(Y = Y, X = X, family = binomial(), SL.library = SL.library, method = "method.NNLS",
verbose = TRUE)
Risk Coef
SL.glmnet_All 0.2460486 0.0000000
SL.glm_All 0.2507033 0.2423697
SL.knn_All 0.2508500 0.3493301
SL.mean_All 0.2475494 0.4083002
请注意,Coefs 是非负数且总和为 1。有没有办法使用与 glm 相同的优化器?还是使用相同约束的不同优化器?我试过了:
glm(Y ~ as.matrix(X), family = "binomial", method = "method.NNLS")
但它不起作用。
【问题讨论】:
-
glmnet 包中的glmnet 接受边界。
-
@G.Grothendieck,它可以添加一个约束,使系数总和为 1?
-
我正在努力解决这个问题,但这并不重要。 (1)
nnls优化器本身仅将参数约束为非负数。method.NNLS代码通过简单地将系数除以它们的总和以确保它们总和为 1 来处理 sum-to-1 约束。这与拟合 GLM 时不同 (AFAICT)约束。你能确认你对这种类型的解决方案没问题,或者你真的想用限制为总和为 1 的参数来拟合模型吗? -
(2) 您对 SuperLearner 优化器和插入
glm()的方法的承诺/必要性如何?换句话说,解决问题的替代解决方案(拟合参数限制为非负且总和为 1 的二项式 GLM)可以解决您的问题吗? -
(1) 如果可能,我想拟合模型,其参数总和为 1 (2) 我不致力于 SuperLearner 优化器。替代解决方案将解决我的问题。
标签: r optimization glm