如何在R中使用固定形状参数为1的Gamma GLM?含glmnet报错问题
关于glmnet自定义Gamma族及单变量输入报错的问题
一、固定形状参数为1的Gamma族自定义问题
需求是创建形状参数固定为1、链接函数为log的Gamma族,你尝试的代码:
cv.glmnet(x=as.matrix(all_datasets[,c("V1","V2")]), y=all_datasets$V4, family= Gamma(link="log"), type.measure = "mse", alpha = 1, nlambda = 100)
虽然能运行,但原生Gamma(link="log")在glmnet中是默认自动估计形状参数,而非固定为1,官方文档确实没明确说明这一点。
要固定形状参数为1,需要自定义族对象。注意:形状为1的Gamma分布等价于指数分布,我们可以基于这个特性编写自定义族:
# 自定义形状固定为1、log链接的Gamma族 gamma_log_shape1 <- list( family = "gamma", link = "log", linkfun = function(mu) log(mu), linkinv = function(eta) exp(eta), variance = function(mu) mu^2, # Gamma方差公式为mu²/shape,shape=1时简化为mu² dev.resids = function(y, mu, wt) { wt * (2 * (log(mu/y) + y/mu - 1)) # shape=1对应的偏差残差计算式 }, mu.eta = function(eta) exp(eta), initialize = expression({ if (any(y <= 0)) stop("响应变量y必须为正数") mustart <- y }) )
调用时直接使用这个自定义族:
cv.glmnet(x=as.matrix(all_datasets[,c("V1","V2")]), y=all_datasets$V4, family=gamma_log_shape1, type.measure = "mse", alpha = 1, nlambda = 100)
二、单变量输入报错的解决
当仅传入单个变量作为x时,报错:
cv.glmnet(x=as.matrix(all_datasets[,c("V1")]), y=all_datasets$V4, family= Gamma(link="log"), type.measure = "mse", alpha = 1, nlambda = 100) # 错误信息: # Error in glmnet(x, y, weights = weights, offset = offset, lambda = lambda, : # x should be a matrix with 2 or more columns
这是因为glmnet的底层实现默认要求输入特征矩阵至少2列。解决方法很简单,给x添加一列无意义的dummy变量(比如全0列),就能绕过这个检查,且不会影响模型结果(LASSO会自动将dummy列的系数正则化到0):
# 构造带dummy列的特征矩阵 x_single <- cbind(as.matrix(all_datasets[,"V1"]), dummy_col = 0) # 调用cv.glmnet cv.glmnet(x=x_single, y=all_datasets$V4, family=gamma_log_shape1, type.measure = "mse", alpha = 1, nlambda = 100)
内容的提问来源于stack exchange,提问作者Jackie
相关产品推荐
相关产品推荐

