【问题标题】:can´t fit dbinom for log regression不能适合 dbinom 进行对数回归
【发布时间】:2021-03-25 18:27:33
【问题描述】:

我一直在尝试使用 dbinom 拟合四参数对数回归。 四参数对数回归表示为:F(x) = d+(a/(1+exp((b-(x)/c))),其中d=下渐近线(ymin),a+d=上渐近线, b = 拐点, , c = 斜率。 我的响应变量是来自哺乳动物调查数据集的比率(Patch_richness/Richness_proportion),“y”取值从 0 到 1(0.8、0.4、0.25……)。我的目标是比较 glm.null 模型、glm 和 AIC 的四参数对数回归,以找出这三个中的哪一个最适合。使用 dpois 运行 y=count (Patch_Richness) 的函数时没有问题,然后在绘制曲线时只需替换 coeff 值:

library(bbmle)
cerrado = read.csv("data_stack.csv")
attach(cerrado)
logip = function(p,lambda,x){
  a = p[1]
  b = p[2]
  c = p[3]
  d = p[4]
  Riq1 = d+(a/(1+exp((b-(FOREST500+km))/c)))
  -sum(dpois(x,lambda=Riq1, log=TRUE))
}
parnames(logip) = c("a","b","c","d")

modTR.log = mle2(minuslog = logip, start = c(a = 5,b = 72,c = 3,d = 0.1), data  = list(x = Patch_Richness))
summary(modTR.log)
plot(FOREST500,Patch_Richness, xlab = "Forest cover", ylab = "Patch Richness")#original data
curve (-0.29382+(4.95218/(1+exp((118.34117-x)/60.30478))), add=T)

但我在尝试为 y = proportion (Richness_prop) 拟合此函数时遇到问题

logip = function(p, lambda, x){
  a = p[1]
  b = p[2]
  c = p[3]
  d = p[4]
  Riq1 = d+(a/(1+exp((b-(FOREST500 + km))/c)))
  -sum(dbinom(x,18,0.5,log = FALSE))
}
parnames(logip) = c("a","b","c","d")

modTR.log = mle2(minuslog = logip, start = c(a = 1,b = 72,c = 1,d = 0), data = list(x = Richness_prop))

summary(modTR.log)
AIC(modTR.log)

模型仅在 log = FALSE 时运行(带有关于非整数值的警告),但无论起始值中的数字是多少,摘要输出都会给出与初始起始值完全相同的数字作为 coeff 值。所以我想这真的很糟糕。我设置 dbinom 参数对吗?为什么它只与log=FALSE 一起运行?

data

非常感谢一些帮助 谢谢!

【问题讨论】:

    标签: r logistic-regression poisson mle


    【解决方案1】:

    我已经运行了您的第一部分,但我想知道您的模型是否正常?我认为数据和您的模型之间没有很好的契合度。此外,您的 logip 函数有一个不必要的参数“lambda”,因为它是由您自己计算的。 您能否使用此代码,并解释是什么让您认为该代码有效?因为我看到一个模型,其中两个参数都找不到?

    logip = function(p,x){
      a = p[1]
      b = p[2]
      c = p[3]
      d = p[4]
      Riq1 = d+(a/(1+exp((b-(FOREST500+km))/c)))
      -sum(dpois(x,lambda=Riq1, log=TRUE))
    
    parnames(logip) = c("a","b","c","d")
    
    modTR.log = mle2(minuslog = logip, start=list(a=5, b=72,c=3,d=0.1), data=list(x = 
                     Patch_Richness), vecpar=TRUE)
    
    summary(modTR.log)
    coef_fit = coef(modTR.log)
    plot(FOREST500,Patch_Richness, xlab = "Forest cover", ylab = "Patch Richness")
    curve (coef_fit["d"]+(coef_fit["a"]/(1+exp((coef_fit["b"]-x)/coef_fit["d"]))), add=T)
    

    }

    【讨论】:

    • 感谢您的回答。运行您的代码,它的工作方式与我的完全相同。相同的输出。我理解不必要的 lambda,我知道它可能看起来不合适,这只是我运行和比较的众多模型之一。我不完全理解你的问题,但我想做的是估计这些系数的比例:“y”取值从 0 到 1(0.8、0.4、0.25 ......)。我以为我必须使用 dbinom 而不是 dpois,但我遇到了问题,我不确定是否可以对数据执行类似的操作:
    • logip=function(p,x){ a=p[1] b=p[2] c=p[3] d=p[4] Riq1 = d+(a/(1+exp((b-(FOREST2500+km))/c))) -sum(dbinom(x,size=18,p=Riq1,log=TRUE)) } parnames(logip)=c("a","b","c","d") modTR.log=mle2(minuslog=logip, start= c(a=0.8,b=20,c=1,d=0.1), data=list(x=(Richness_prop)))
    • 您基本上是在使用 MLE 进行逻辑回归,对吗?我会首先使用从您想要拟合的模型系列中的精确模型生成的一些虚拟数据,以确保拟合按您的意愿工作。
    猜你喜欢
    • 2021-06-03
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2020-11-01
    • 2020-06-11
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多