首页 文章

如何在glmnet中指定日志链接?

提问于
浏览
6

我在一个广义线性模型上运行一个弹性网,其中的glmnet和插入包在R中 .

我的响应变量是cost(其中cost> $ 0),因此我似乎允许我指定 (link="log") ,如下所示:

> lasso_fit <- glmnet(x, y, alpha=1, family="gaussian"(link="log"), lambda.min.ratio=.001)

我尝试了不同的变种,有没有引用,但没有运气 . glmnet文档没有讨论如何包含日志链接 .

我错过了什么吗? family="gaussian" 是否已隐式假设日志链接?

1 回答

  • 4

    这有点令人困惑,但 glmnetglm 中的 family 参数完全不同 . 在 glm 中,您可以指定 character ,如 "gaussian" ,或者您可以指定具有某些参数的函数,例如 gaussian(link="log") . 在 glmnet 中,您只能使用 character 指定族,如 "gaussian" ,并且无法通过该参数自动设置链接 .

    gaussian 的默认链接是 identity 函数,即根本没有转换 . 但是,请记住链接函数只是 y 变量的转换;你可以自己指定:

    glmnet(x, log(y), family="gaussian")
    

    另请注意, poisson 系列的默认链接是 log ,但目标函数将更改 . 请参阅前两段中 ?glmnet 下的详细信息 .


    你的评论让我重新思考我的答案;我有证据表明它是 not correct .

    正如您所指出的,E [log(Y)]和log(E [Y])之间存在差异 . 我认为上面的代码所做的是适合E [log(Y)],这不是你想要的 . 以下是一些生成数据并确认您在评论中注明的内容的代码:

    # Generate data
    set.seed(1)
    x <- replicate(3,runif(1000))
    y <- exp(2*x[,1] + 3*x[,2] + x[,3] + runif(1000))
    df <- data.frame(y,x)
    
    # Run the model you *want*
    glm(y~., family=gaussian(link="log"), data=df)$coef
    # (Intercept)          X1          X2          X3 
    #   0.4977746   2.0449443   3.0812333   0.9451073 
    
    # Run the model you *don't want* (in two ways)    
    glm(log(y)~., family=gaussian(link='identity'), data=df)$coef
    # (Intercept)          X1          X2          X3 
    #   0.4726745   2.0395798   3.0167274   0.9957110 
    lm(log(y)~.,data=df)$coef
    # (Intercept)          X1          X2          X3 
    #   0.4726745   2.0395798   3.0167274   0.9957110 
    
    # Run the glmnet code that I suggested - getting what you *don't want*.
    library(glmnet)
    glmnet.model <- glmnet(x,log(y),family="gaussian", thresh=1e-8, lambda=0)
    c(glmnet.model$a0, glmnet.model$beta[,1])
    #        s0        V1        V2        V3 
    # 0.4726745 2.0395798 3.0167274 0.9957110
    

相关问题