用户定义的“负指数”链接glm

时间:2018-11-14 19:30:04

标签: r glm

我尝试遵循此示例modify glm... user specificed link function in r 但出现错误。我有二进制数据,并且想将链接功能从“ logit”更改为负指数链接。我想预测

成功概率(p)= 1-exp(线性预测变量)

我需要此链接而不是内置链接之一的原因是,p以凸方式在0到0.5之间增加,但是仅“ logit”,“ cloglog”,“ probit”和“ cauchy”允许凹形。请参阅随附的照片以供参考:predicted p vs binned observations

模拟数据

location<-as.character(LETTERS[rep(seq(from=1,to=23),30)])
success<-rbinom(n=690, size=1, prob=0.15)
df<-data.frame(location,success)
df$random_var<-rnorm(690,5,3)
df$seedling_size<-abs((0.1+df$success)^(1/df$random_var))
df<-df[order(df$location)]

创建自定义链接功能。注意:eta =线性预测变量,mu =概率

negex<-function(){
##link
linkfun<-function(mu) log(-mu+1)
linkinv<-function(eta) 1-exp(eta)
## derivative of inverse link with respect to eta
mu.eta<-function(eta)-exp(eta)
valideta<-function(eta) TRUE
link<-"log(-mu+1)"
structure(list(linkfun=linkfun,linkinv=linkinv,
             mu.eta=mu.eta,valideta=valideta,
             name=link),
        class="link-glm")
}

模型成功与幼苗大小的关系

negexp<-negex()

model1<-glm(success~seedling_size,family=binomial(link=negexp),data=df)
  

错误:找不到有效的系数集:请提供起始值

使用glmer建模(我的最终目标)

model2<-glmer(success~seedling_size+ (1|location),family=binomial(link=negexp),data=df)
  

(函数(fr,X,reTrms,family,nAGQ = 1L,verbose = 0L,maxit = 100L,:     (maxstephalfit)PIRLS减半未能减少pwrssUpdate中的偏差

我得到了不同的错误消息,但是无论使用glmer还是glm,我都认为问题是相同的,那就是我的链接函数某种程度上是错误的。

1 个答案:

答案 0 :(得分:0)

我找到了答案。最有用的是这个R thread from 2016。有2个问题。首先,我的链接功能是错误的。我将其修改为:

negex <- function() 
 { 
 linkfun <- function(mu) -log(1-mu) 
 linkinv <- function(eta) 1-exp(-eta) 
 mu.eta <- function(eta) exp(-eta) 
 valideta <- function(eta) all(is.finite(eta)&eta>0) 
 link <- paste0("negexp") 
 structure(list(linkfun = linkfun, linkinv = linkinv, 
             mu.eta = mu.eta, valideta = valideta, name = link), 
        class = "link-glm") 
} 

第二,模型需要特定的起始值。这些将是您数据唯一的。这是我实际找到解决方案的数据的前几行:

   site plot sub_plot oak_success oak_o1_gt05ft..1
  0001   10        3           1                0
  0001   12        2           0                0
  0001   12        3           0                0
  0001   12        4           0                0
  0001   13        4           0                0

我不知道如何将完整的数据发布到此站点,但是如果有人希望运行该示例,请给我发送电子邮件:lake.graboski@gmail.com

negexp<-negex()

希望这对将来的人有所帮助,因为我发现在堆栈溢出或联机时都没有解决此问题的其他示例。使用新的初始值,我能够运行模型:

starting_values<-c(1,0) #1 for the intercept and 0 for the slope
h_gt05_solo_negex2<-glm(oak_success~ oak_o1_gt05ft..1 , 
                    family=binomial(link=negexp),start=starting_values,data=rocdf)
summary(h_gt05_solo_negex2)
Call:
glm(formula = oak_success ~ oak_o1_gt05ft..1, family = binomial(link = negexp), 
data = lt40, start = starting_values)

Deviance Residuals: 
Min       1Q   Median       3Q      Max  
-1.3808  -0.4174  -0.2637  -0.2637   2.5985  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)      0.034774   0.005484   6.341 2.28e-10 ***
oak_o1_gt05ft..1 0.023253   0.002187  10.635  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 1416.9  on 2078  degrees of freedom
Residual deviance: 1213.5  on 2077  degrees of freedom
AIC: 1217.5

Number of Fisher Scoring iterations: 6

收敛存在一些问题。随着苗高(oak_o1_gt05ft..1)超过40英尺,参数估计变得不可靠convergence issues。我在此范围内只有很少的观测值,因此我将数据限制在观测值小于40ft的观测值上,然后重新运行模型。我还包括“站点”(与模拟数据中的“位置”相同)。您在this figure中看到的是每个位置/位置相对于橡树幼苗高度的橡树成功预测(黑色圆圈),成功/样本的装箱观察(大绿点)以及不存在时的成功概率预测场地因素(蓝线)。位置考虑后,苗木大小变量的斜率看起来更准确。

不幸的是,我无法使该模型运行得一帆风顺,因此必须将站点作为固定效果包括在内,因此,橡树幼苗高度的标准误差和坡度估算可能有点保守。