首页 文章

偏移不适用于二项式GLM

提问于
浏览
4

我正在尝试使用 glm( family='binomial') 进行逻辑回归 .

这是模型:

model<-glm(f_ocur~altitud+UTM_X+UTM_Y+j_sin+j_cos+temp_res+pp, 
           offset=(log(1/off)), data=mydata, family='binomial')

mydata 有76820条意见 . 响应变量(f_ocur)为0-1 .
此数据是较大数据集的样本,因此设置偏移量的想法是考虑到此处使用的数据代表要分析的实际数据的样本 .

由于某种原因,偏移不起作用 . 当我运行这个模型时,我得到一个结果,但是当我运行相同的模型但没有偏移时,我得到与前一个模型完全相同的结果 . 我期待一个不同的结果,但没有区别 .

难道我做错了什么?偏移应该与线性预测因子一致吗?像这样:

model <- glm(f_ocur~altitud+UTM_X+UTM_Y+j_sin+j_cos+temp_res+pp+offset(log(1/off)), 
             data=mydata, family='binomial')

模型准备好后,我想将它与新数据一起使用 . 新数据将是验证此模型的数据,此数据具有相同的列 . 我的想法是使用:

validate <- predict(model, newdata=data2, type='response')

这是我的问题,预测函数是否考虑了用于创建模型的偏移量?如果没有,我应该怎么做才能获得新数据的正确概率?

2 回答

  • 4

    我认为对数偏移与Poisson系列一起使用 . 如果是二项式,则不应使用日志 . 检查链接https://stats.stackexchange.com/questions/25415/using-offset-in-binomial-model-to-account-for-increased-numbers-of-patients

  • 2

    看看你的问题,我猜你的主要问题是为什么偏移没有任何区别 .

    从@Ben Bolker Rpub窃取一句话(https://rpubs.com/bbolker/logregexp):"A very common situation in ecology (and elsewhere) is a survival/binary-outcome model where individuals (each measured once) differ in their exposure. The classical approach to this problem is to use a complementary log-log link."

    所以在此基础上,我建议您正在寻找的代码可能是:

    model <- glm(f_ocur~altitud+UTM_X+UTM_Y+j_sin+j_cos+temp_res+pp, 
           data=mydata, family = binomial(link = cloglog),offset=log(1/off))
    

    下面是一个小例子,它表明不仅有和没有偏移的结果不同,但使用AICc模型选择,尽管“时间”与“网站”混淆,但更好的模型排名更高 .

    library(AICcmodavg)
    
    set.seed(1)
    time <- c(rep(1,50),rep(2,50))
    site <- c(rep("site 1",50),rep("site 2",50))
    surv <- c(rbinom(50,1,prob=0.7),rbinom(50,1,prob=0.7^2))
    
    my.data <- data.frame(surv, site, time)
    
    # setup AICc model list
    Cand.models <- list( )
    
    Cand.models[[1]] <- glm(surv ~ 1, data=my.data, family = binomial(link = cloglog), offset=log(1/time))
    Cand.models[[2]] <- glm(surv ~ 1, data=my.data, family = binomial(link = cloglog))
    Cand.models[[3]] <- glm(surv ~ site , data=my.data, family = binomial(link = cloglog), offset=log(1/time))
    
    # create a vector of names to trace back models in set
    Modnames <- paste("mod", 1:length(Cand.models), sep = " ")
    
    # generate AICc table
    aictab(cand.set = Cand.models, modnames = Modnames, sort = TRUE)
    

相关问题