[英]Fitting Generalized Nonlinear Model in R
我想拟合以下广义非线性模型: Probit(G)=K+1/Sigma*(Temp-T0)*Time
。 作为朴素的模型,我通过Probits(G)
创建了qnorm(G)
,然后拟合了Nonlinear Model
。 但是我想用logit
链接拟合Nonlinear Model
,类似于R
glm
函数。
如何在R
使用logit
链接拟合这样的广义非线性模型?
Data <-
structure(list(Temp = c(23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L,
27L, 27L, 27L, 27L, 27L, 27L, 33L, 33L, 33L, 33L, 33L, 33L, 33L,
35L, 35L, 35L, 35L, 35L), Time = c(144L, 168L, 192L, 216L, 240L,
264L, 288L, 312L, 120L, 144L, 168L, 192L, 216L, 240L, 72L, 96L,
120L, 144L, 168L, 192L, 216L, 96L, 120L, 144L, 168L, 192L), G = c(15,
25.5, 27, 28, 28.5, 39.5, 41.5, 43, 13, 21.5, 29.5, 30.5, 32.5,
35, 13.5, 28, 32.5, 33.5, 35, 39.5, 42, 6.5, 30, 39.5, 57, 58.5
)), .Names = c("Temp", "Time", "G"), class = "data.frame", row.names = c(NA,
-26L))
Data$GermRate <- 1/Data$Time
Data$Probits <- qnorm(p=Data$G/100) # Get Probits
fm1 <-
nls(
formula= Probits ~ K+1/Sigma*(Temp-T0)*Time
, data=Data
, start=list(K=1, Sigma=2, T0=2)
#, algorithm= "port"
)
fm1Summary <- summary(fm1)
fm1Coef <- summary(fm1)$coef
您可以使用gnm
软件包将这种类型的模型gnm
为广义非线性模型。 由于gnm
使用"nonlin"
类的预定义函数来指定模型中的非线性项,因此需要一些工作,而软件包提供的项通常不足以指定任意非线性函数。 但是,可以定义与gnm
一起使用的自定义"nonlin"
gnm
"nonlin"
函数。
在您的模型中, k
是线性参数,因此我们只需要担心第二项。 可以通过以下"nonlin"
函数指定
customNonlin <- function(Temp, Time){
list(predictors = list(sigma = 1, t0 = 1),
variables = list(substitute(Temp), substitute(Time)),
term = function(predLabels, varLabels) {
sprintf("1/%s * (%s - %s) * %s",
predLabels[1], varLabels[1],
predLabels[2], varLabels[2])
})
}
class(customNonlin) <- "nonlin"
在返回的列表中,
predictors
指定sigma
和t0
是具有单个截距项的预测变量(即,各个参数)。 variables
指定有两个变量,由用户通过Temp
和Time
参数提供。 term
指定给定预测变量和变量的标签的函数,以创建该术语的简化的数学表达式。 有关"nonlin"
功能的更多详细信息,请参见gnm插图的第3.5节。
现在我们可以尝试如下拟合模型
mod1 <- gnm(cbind(G, 100 - G) ~ customNonlin(Temp, Time), family = binomial,
data = Data, start = c(1, 2, 2))
请注意,就像在glm
,默认情况下会将截距添加到公式中,此处将表示k
。 尽管起始值离解gnm
,但gnm
已满足gnm
收敛标准,因此该算法不执行任何迭代。 在这种情况下,需要更好的sigma
起始估计值才能使gnm
收敛到更明智的值
mod2 <- gnm(cbind(G, 100 - G) ~ customNonlin(Temp, Time), family = binomial,
data = Data, start = c(1, 2000, 2))
mod2
Call:
gnm(formula = cbind(G, 100 - G) ~ customNonlin(Temp, Time), family = binomial,
data = Data, start = c(1, 2000, 2))
Coefficients:
(Intercept) sigma t0
-2.589 1915.602 8.815
Deviance: 53.53157
Pearson chi-squared: 49.91347
Residual df: 23
实际上,只要您不介意重新模型化模型, 就可以使用gnm
提供的Mult
函数来指定此模型:
mod3 <- gnm(cbind(G, 100 - G) ~ Mult(1, 1 + offset(Temp), offset(Time)),
family = binomial, data = Data,
start = c(1, 1/2000, -2))
mod3
Call:
gnm(formula = cbind(G, 100 - G) ~ Mult(1, offset(Temp) + 1, offset(Time)),
family = binomial, data = Data, start = c(1, 1/2000, -2))
Coefficients:
(Intercept)
-2.588874
Mult(., 1 + offset(Temp), offset(Time)).
0.000522
Mult(1, . + offset(Temp), offset(Time)).
-8.815152
Deviance: 53.53157
Pearson chi-squared: 49.91347
Residual df: 23
编辑
参数的功能在customNonlin
返回的列表的term
组件中指定,您可以通过
customNonlin(Temp, Time)$term(c("sigma", "t0"), c("Temp", "Time"))
"1/sigma * (Temp - t0) * Time"
因此,如果您只想更改功能形式,则需要修改term
功能。 如果要添加/删除参数,则还需要修改predictors
组件中的列表。 同样,如果新术语要求您添加/删除变量,则可以修改variables
组件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.