这有点令人困惑,但是glmnet 和glm 中的family 参数是完全不同的。在glm 中,您可以指定character,例如"gaussian",或者您可以指定带有一些参数的函数,例如gaussian(link="log")。在glmnet 中,只能用character 指定族,如"gaussian",无法通过该参数自动设置链接。
gaussian 的默认链接是identity 函数,即根本没有转换。但是,请记住,链接函数只是您的 y 变量的转换;你可以自己指定:
glmnet(x, log(y), family="gaussian")
还要注意poisson 系列的默认链接是log,但目标函数会发生变化。请参阅前几段中?glmnet 下的详细信息。
你们的 cmets 让我重新思考我的答案;我有证据表明它不正确。
正如您所指出的,E[log(Y)] 和 log(E[Y]) 之间存在差异。我认为上面的代码所做的是适合 E[log(Y)],这不是你想要的。下面是一些代码,用于生成数据并确认您在 cmets 中记录的内容:
# 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