R中的GLM功能,日志链接不起作用

时间:2012-11-26 14:45:00

标签: r stata

我正在使用Hardin和Hilbe的书“Generalized Linear Models and Extension”(第二版,2007)。作者提出,“日志链接通常用于响应数据,而不是OLS模型,而这些响应数据在连续尺度上仅采用正值”。当然,他们还建议使用残差图来检查是否仍然可以使用使用身份链接的“正常”线性模型。

我试图在R中复制他们在STATA中所做的事情。实际上,我在STATA中没有日志链接的问题。但是,当使用R的glm函数调用相同的模型时,但是指定family=gaussian(link="log")我被要求提供起始值。当我将它们全部设置为零时,我总是得到算法没有收敛的消息。选择其他值的消息有时是相同的,但我经常得到:

Error in glm.fit(x = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  :
     NA/NaN/Inf in 'x'

正如我所说,在STATA中,我可以在不设置起始值且没有错误的情况下运行这些模型。我尝试了很多不同的模型和不同的数据集,但问题总是一样的(除非我只包含一个单独的自变量)。谁能告诉我为什么会出现这种情况,或者我做错了什么,或者为什么书中建议的模型可能不合适?我很感激任何帮助,谢谢!

编辑:作为再现错误的示例,请考虑可以下载的数据集here。加载此数据集后,我运行以下模型:

mod <- glm(betaplasma ~ age + vituse, family=gaussian(link="log"), data=data2, start=c(0,0,0))

这会产生警告消息,表明算法没有收敛。

Edit2:我被要求提供该模型的STATA输出。这是:

. glm betaplasma age vituse, link(log)

Iteration 0:   log likelihood = -2162.1385  
Iteration 1:   log likelihood = -2096.4765  
Iteration 2:   log likelihood = -2076.2465  
Iteration 3:   log likelihood = -2076.2244  
Iteration 4:   log likelihood = -2076.2244  

Generalized linear models                          No. of obs      =       315
Optimization     : ML                              Residual df     =       312
                                                   Scale parameter =  31384.51
Deviance         =  9791967.359                    (1/df) Deviance =  31384.51
Pearson          =  9791967.359                    (1/df) Pearson  =  31384.51

Variance function: V(u) = 1                        [Gaussian]
Link function    : g(u) = ln(u)                    [Log]

                                                   AIC             =  13.20142
Log likelihood   = -2076.224437                    BIC             =   9790173

------------------------------------------------------------------------------
             |                 OIM
  betaplasma |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
         age |   .0056809   .0032737     1.74   0.083    -.0007354    .0120972
      vituse |   -.273027   .0650773    -4.20   0.000    -.4005762   -.1454779
       _cons |   5.467577   .2131874    25.65   0.000     5.049738    5.885417
------------------------------------------------------------------------------

2 个答案:

答案 0 :(得分:12)

正如我在评论中所说的那样,Stata可能比R更具有鲁棒性(在数值上,而不是统计意义上)GLM拟合。也就是说,拟合这个特定的数据集不会看起来太难了。

阅读数据:

data2 <- read.table("http://lib.stat.cmu.edu/datasets/Plasma_Retinol",
         skip=30,nrows=315)
dnames <- c("age","sex","smokstat","quetelet","vituse","calories","fat","fiber",
           "alcohol","cholesterol","betadiet","retdiet","betaplasma","retplasma")
names(data2) <- dnames

绘制数据:

par(mfrow=c(1,2),las=1,bty="l")
with(data2,plot(betaplasma~age))
with(data2,boxplot(betaplasma~vituse))

enter image description here

通过将截距参数的起始值设置为合理的值(即接近对数刻度上数据平均值的某些内容:这些中的任何一个

),可以很容易地得到这些值。
mod <- glm(betaplasma ~ age + vituse, family=gaussian(link="log"), data=data2,
           start=c(10,0,0))
mod <- glm(betaplasma ~ age + vituse, family=gaussian(link="log"), data=data2,
           start=c(log(mean(data2$betaplasma)),0,0))

后一种情况可能是启动日志链接拟合的合理默认策略。结果(略有缩写)与Stata非常接近:

summary(mod)
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  5.467575   0.218360  25.039  < 2e-16 ***
## age          0.005681   0.003377   1.682   0.0935 .  
## vituse      -0.273027   0.065552  -4.165 4.03e-05 ***
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
## 
## (Dispersion parameter for gaussian family taken to be 31385.26)
## 
##     Null deviance: 10515638  on 314  degrees of freedom
## Residual deviance:  9791967  on 312  degrees of freedom
## AIC: 4160.4
## 
## Number of Fisher Scoring iterations: 9

confint(mod)
##                     2.5 %      97.5 %
## (Intercept)  5.0364648709  5.87600710
## age         -0.0007913795  0.01211007
## vituse      -0.4075213916 -0.14995759

(R对于p值和(?)置信区间使用t而不是Z统计量)

然而,我可能不适合这些数据的原因有几个。特别是,恒定方差(与高斯模型相关)的假设不是很合理 - 这些数据似乎更适合对数正态模型(或等效地,仅用于对数变换和使用标准高斯模型进行分析)。 p>

log(1+x)比例绘制(数据中有一个零条目):

with(data2,plot(log(1+betaplasma)~age))
with(data2,boxplot(log(1+betaplasma)~vituse))

enter image description here

使用ggplot绘图(这适用于vituse的每个值的单独行,而不是拟合附加模型)

library(ggplot)
theme_set(theme_bw())
(g1 <- qplot(age,1+betaplasma,colour=factor(vituse),data=data2)+
    geom_smooth(method="lm")+
    scale_y_log10())

enter image description here

没有'异常值'的视图:

g1 %+% subset(data2,betaplasma>0)

enter image description here

另外两点:(1)在这个数据集中有一个值为0的响应有点奇怪 - 不是不可能,而是奇数; (2)看起来vituse应该被视为一个因素而不是数字(“1 =是,经常,2 =是,不经常,3 =否”) - 可能是序数。

答案 1 :(得分:5)

我想建议可能是非正常的错误。如果您同意(或者更确切地说,如果数据同意),那么请考虑这种结构:

?family
?glm
?binomial
lfit <- glm( dep <- indep1 + indep2, data=dat, family=binomial(link="probit")

这应该提供身份识别模型周围的二项式错误。这样做的好处是您的估计值更容易在变量的原始范围内解释。对早先使用带有probit链接的family = poisson错误建议表示歉意。请记住,您从未提供任何数据甚至是分布的描述。显然,二项式错误不适合@BenBolker提供的数据集。

如果您的非整数值具有对数正态分布的错误,则应考虑quasipoisson模型。如果你对Ben Bolker提供的数据运行这个模型并比较高斯(link =“log)模式,它们几乎无法区分,也不需要起始值。

> mod2 <- glm(betaplasma ~ age + vituse, family=quasipoisson, data=data2         )
> mod2

Call:  glm(formula = betaplasma ~ age + vituse, family = quasipoisson, 
    data = data2)

Coefficients:
(Intercept)          age       vituse  
   5.452014     0.006096    -0.276679  

Degrees of Freedom: 314 Total (i.e. Null);  312 Residual
Null Deviance:      37270 
Residual Deviance: 33420    AIC: NA 

> glm(betaplasma ~ age + vituse, family=gaussian(link="log"), data=data2,
+            start=c(10,0,0))

Call:  glm(formula = betaplasma ~ age + vituse, family = gaussian(link = "log"), 
    data = data2, start = c(10, 0, 0))

Coefficients:
(Intercept)          age       vituse  
   5.467575     0.005681    -0.273027  

Degrees of Freedom: 314 Total (i.e. Null);  312 Residual
Null Deviance:      10520000 
Residual Deviance: 9792000  AIC: 4160 

你应该使用稍微复杂一点的模型,因为vituse显然是一个三级因素:

> mod2 <- glm(betaplasma ~ age + factor(vituse), family=quasipoisson, data=data2         )
> mod2

Call:  glm(formula = betaplasma ~ age + factor(vituse), family = quasipoisson, 
    data = data2)

Coefficients:
    (Intercept)              age  factor(vituse)2  factor(vituse)3  
       5.151076         0.006359        -0.224107        -0.562727  

Degrees of Freedom: 314 Total (i.e. Null);  311 Residual
Null Deviance:      37270 
Residual Deviance: 33380    AIC: NA