有点令人困惑,但是在
glmnet
和
glm
中的
family
参数是不同的。在
glm
中,您可以指定一个像
"gaussian"
这样的
character
,或者您可以指定一个带有某些参数的函数,如
gaussian(link="log")
。在
glmnet
中,您只能使用一个
character
来指定family,比如
"gaussian"
,并且没有办法通过该参数自动设置link。
gaussian
的默认链接是
identity
函数,也就是根本没有转换。但是,请记住,链接函数只是您的
y
变量的一个转换;您可以自己指定它:
glmnet(x, log(y), family="gaussian")
请注意,
poisson
系列的默认链接是
log
,但目标函数会改变。请参见第一段的
?glmnet
下的详细信息。
您的评论让我重新考虑了我的答案;我有证据表明它是
不正确的。
正如您所指出的,E[log(Y)]和log(E[Y])之间存在差异。我认为上面的代码做的是拟合E[log(Y)],这不是您想要的。以下是一些生成数据并确认您在评论中提到的内容的代码:
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)
glm(y~., family=gaussian(link="log"), data=df)$coef
glm(log(y)~., family=gaussian(link='identity'), data=df)$coef
lm(log(y)~.,data=df)$coef
library(glmnet)
glmnet.model <- glmnet(x,log(y),family="gaussian", thresh=1e-8, lambda=0)
c(glmnet.model$a0, glmnet.model$beta[,1])
glmnet
代码,你会发现glmnet(..., family="gaussian")
调用了elnet
,而elnet
又调用了Fortran的spelnet
函数。(泊松回归调用fishnet
,它又调用了fishnet
或者spfishnet
(用于稠密和稀疏模型矩阵)。所以我怀疑需要有人从头开始编写一个变种的弹性网络来处理对数链接... - Ben Bolker