【问题标题】:dbinom - 4 parameter logistic regressiondbinom - 4 参数逻辑回归
【发布时间】:2021-06-03 16:12:56
【问题描述】:
library(grid)
library(gridExtra)
library(broom)
library(BiodiversityR)
library("vegan")#[1]
library("MASS")#[2]
library(nlme)#[3]
library("bbmle")

这里是data

我正在评估哪种模型最适合我的数据(空模型/glm-poisson/4 参数日志)。使用对数的想法是检测在景观中森林覆盖率的某些值下响应(数量、物种比例)在哪个点减少/增加。我一直在使用下一个代码来拟合使用 dpois(y=count of species)的四参数逻辑回归:

logip=function(p,lambda,x){
  a=p[1]
  b=p[2]
  c=p[3]
  d=p[4]
  Riq1 = d+(a/(1+exp((b-(FOREST700+km))/c)))
  -sum(dpois(x,lambda=Riq1, log=TRUE))
}
parnames(logip)=c("a","b","c","d")

modTR.log=mle2(minuslog=logip, start= c(a=2,b=60,c=3,d=0.1),
               data=list(x=Patch_Richness))

但现在我想对作为比例的因变量使用相同的方法(y = 在一个站点注册的物种的比例)。我想我应该使用二项式,所以我在之前的函数中尝试了dbinom

logip=function(p,size,prob){
 a=p[1]
 b=p[2]
 c=p[3]
 d=p[4]
 Riq1 = d+(a/(1+exp((b-(FOREST500+km))/c)))
 -sum(dbinom(size,prob=Riq1))
}parnames(logip)=c("a","b","c","d")

modTR.log=mle2(minuslog=logip, start= c(a=1,b=72,c=3,d=0.1),
               data=list(x=cbind(Regional_Richness,Patch_Richness)))

我收到了这条消息:

mle2 中的错误(minuslog = logip, start = c(a = 1, b = 72, c = 3, d = 0.1), : 'start' 中的一些命名参数不是指定对数似然函数的参数.

我不知道使用dbinom 是否正确以及如何在我正在使用的函数中应用它。希望你能帮助我。

【问题讨论】:

  • 对于初学者,您不会使用逻辑回归对泊松计数数据进行建模。逻辑回归对取值为 0 或 1 的二进制因变量建模,而泊松分布变量可以取任何非负整数值。如果您可以包含一些数据、您想要完成的任务以及您正在使用的包,那将会很有帮助。
  • 谢谢,我已经包含了我正在使用的链接和包
  • 第二个函数是否有错字;你使用dnorm 而不是dbinom
  • 是的,有一个错字,现在是正确的
  • Google 表格要求我申请访问权限。你能让数据免费下载吗?

标签: r function logistic-regression


【解决方案1】:

对于二项分布,有两个参数。看起来 Patch_Richness 永远不会大于 2,所以我将 size 参数设置为 2,并使用您的公式来预测概率参数。请注意,对数似然是 -23。

library(bbmle)
text="Bioma_MAPBIOMAS   km  Regional_Richness   Patch_Richness  Richness_prop   FOREST500
Cerrado 35.1    2   2   1   100
Cerrado 131.4   2   2   1   100
Cerrado 40  2   1   0.5 100
Cerrado 8   1   1   1   72.37
Cerrado 28  1   0   0   85.06
Cerrado 5   1   0   0   29.65
Cerrado 5   1   0   0   25.38
Cerrado 28  1   0   0   77.97
Cerrado 5   1   0   0   70.09
Cerrado 28  1   0   0   100
Cerrado 20  1   0   0   97.48
Cerrado 8   1   0   0   66.89
Cerrado 8   1   0   0   77.96
Cerrado 8   1   0   0   65.17
Cerrado 8   1   0   0   50.86
Cerrado 20  1   0   0   89.1
Cerrado 3   1   1   1   31.49
Cerrado 27.8    1   1   1   62.9"
df=read.table(text=text, header=TRUE, stringsAsFactors = FALSE)
logip=function(p,x){
  a=p[[1]]
  b=p[[2]]
  c=p[[3]]
  d=p[[4]]
  Riq1 = d+a/(1+exp((b-(x$FOREST500+x$km))/c))
  if (any(Riq1>=1) | any(Riq1<=0)) {
    return(9999999)
  }
  -sum(log(dbinom(x$Patch_Richness, 2, prob=exp(Riq1)/(1+exp(Riq1)))))
}
parnames(logip)=c("a","b","c","d")

modTR.log=mle2(minuslog=logip, start= c(a=.1,b=72,c=1,d=.1),
               data=list(x=df))
Call:
mle2(minuslogl = logip, start = c(a = 0.1, b = 72, c = 1, d = 0.1), 
    data = list(x = df))

Coefficients:
           a            b            c            d 
3.811005e-02 7.200033e+01 1.000584e+00 8.823313e-04 

Log-likelihood: -22.45 

泊松分布也是如此。请注意,对数似然是 -14。因此,考虑到您的方程 Riq1 = d+(a/(1+exp((b-(x$FOREST500+x$km))/c))) 和初始条件,泊松分布会更好。

logip=function(p,x){
  a=p[[1]]
  b=p[[2]]
  c=p[[3]]
  d=p[[4]]
  Riq1 = d+(a/(1+exp((b-(x$FOREST500+x$km))/c)))
  if (any(Riq1<=0)) {
    return(9999999)
  }
  -sum(dpois(x$Patch_Richness,lambda=Riq1, log=TRUE))
}
parnames(logip)=c("a","b","c","d")

modTR.log=mle2(minuslog=logip, start= c(a=2,b=60,c=3,d=0.1),
               data=list(x=df))
modTR.log

Call:
mle2(minuslogl = logip, start = c(a = 2, b = 60, c = 3, d = 0.1), 
    data = list(x = df))

Coefficients:
          a           b           c           d 
 0.49350452 77.68600468  0.04856004  0.14285921 

Log-likelihood: -14.5 

【讨论】:

  • 谢谢!为 y=Richness_prop 运行这个:-sum(log(dbinom(x$Richness_prop, 1, prob=exp(Riq1)/(1+exp(Riq1))))) } 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=df))' Got:Error in optim(par = c(a = 1, b = 72, c = 1, d = 0), fn = function (p) : non-finite finite-diff value In dbinom(x$Richness_prop, 1, prob = exp(Riq1)/(1 + exp(Riq1))) : non-integer x = 0.5
  • 也试过这个:} -sum(log(dbinom(x$cbind(Regional_Richness,Patch_Richness), 1, prob=exp(Riq1)/(1+exp(Riq1))))) }...... 在这里我尝试在 glm 中包含丰富度比例,但也没有用:` x$cbind(Regional_Richness, Patch_Richness) 中的错误:尝试应用非函数`
  • @mmr09 这可能是因为 Richness_prop 列中的值为 0.5,但大小为 2 的二项式仅预测 0,1,2(无分数)。您可以使用 Regional_Richness 来完成,因为该列仅包含 1 和 2。
  • 您对我应该为 Richness_proportion 使用什么有什么建议吗?我真的需要将其用作 y,并拥有其他值为 0.5、0.67、0.43...等的数据集。我认为二项式适用于此类数据,在我的情况下是 Patch_richness/Regional/Richness
  • 试试 glm(data=df, Richness_prop ~ FOREST500 + km, family=“binomial”) @mmr09 也许你指的是这个二项式族而不是二项式分布。
猜你喜欢
  • 2022-11-12
  • 1970-01-01
  • 2020-01-31
  • 2017-01-19
  • 2017-03-27
  • 1970-01-01
  • 2019-12-09
  • 2018-12-09
  • 2021-11-11
相关资源
最近更新 更多