我想通过迭代重加权方法(手动)导出伽马回归系数。当我运行这个代码与出for{}
循环它工作正常,但与循环它产生NaN
。我的代码是:
n<-10
y <- rgamma(n, 10, 0.1)
x1 <- rnorm(n, -1,1)
x2 <- rnorm(n, -1,1)
x3 <- rnorm(n, -1,1)
x<-as.matrix(cbind(1,x1,x2,x3))
reg <-glm(y~x1+x2+x3, family=Gamma(link = "inverse"))
### step 1
W<-G<-matrix(0,ncol=length(y),nrow=length(y))
b<-rep(0,4)
for(i in 1:50) {
### step 2
eta<-x%*%b
mu<-pnorm(eta)
diag(G)<-1/dnorm(eta)
z<-eta + G%*%(y - mu)
diag(W)<-(dnorm(eta)^2)/(mu*(1-mu))
### step 3
b <- solve(t(x)%*%W%*%x)%*%t(x)%*%W%*%z
}
我的第二个问题是关于glm()
的,有没有什么方法可以描述glm()
使用了多少次迭代?
更新
在this的帮助下,我更新了此代码,但它不工作。
library(gnlm)
# custom link / inverse
inv <- function(eta) -1/(eta)
n<-10
y <- rgamma(n, 10, 0.1)
x1 <- rnorm(n, -1,1)
x2 <- rnorm(n, -1,1)
x3 <- rnorm(n, -1,1)
x<-as.matrix(cbind(1,x1,x2,x3))
reg <-glm(y~x1+x2+x3, family=Gamma(link = "inverse"))
library(gnlm)
reg1<- gnlr(y=y,
distribution = "gamma",
mu = ~ inv(beta0 + beta1*x1 + beta2*x2 + beta3*x3),
pmu = list(beta0=1, beta1=1, beta2=1, beta3=1),
pshape=0.1
)
我想得到reg
和reg1
相同的结果。
2条答案
按热度按时间cgh8pdjw1#
对于第一个代码块,该算法用于概率单位回归,而不是γ。要使用
glm
的默认值(family = Gamma(link = "inverse")
没有权重和偏移)手动执行迭代,请按如下方式更新代码。reg$iter
是glm
函数执行的迭代次数。检查b
是否等于glm
给出的系数:qyyhg6bp2#
pshape
更改为1.0。glm
结果设置它们是一种常见的方法。另一种方法是@jblood94的答案。还有一种方法是使用nls()
进行(粗略的)初始估计。glm()
中的参数trace=TRUE
将显示迭代次数其中:
不同链接和使用
nls
获取起始值的示例:还有一个