问题描述
我的目的是从面板数据中估计 5 个参数。 我使用 optim() 包来估计参数。 所以,我首先写了 Pr[N_[i,1],N_[i,2],...,T]] 的 pdf。 下面是多元负二项式面板数据的参数估计代码。
library(pglm)
library(plm)
data("HealthIns")
dat<- pdata.frame(HealthIns,index = c("id","year"))
summary(dat)
y<-data.matrix(dat$mdu)
y[is.na(y)]=0
Y<-matrix(data=y,nrow=5908,ncol=5)
dat$ageclass<-ifelse(dat$age >=30,1,0)
x1<-data.matrix(dat$ageclass)
x1[is.na(x1)]=0
X1<-matrix(data=x1,ncol=5)
dat$gender <-ifelse(dat$sex=="male",0)
x2<-data.matrix(dat$gender)
x2[is.na(x2)]=0
X2<-matrix(data=x2,ncol=5)
dat$child<-ifelse(dat$child=="yes",0)
x3<-data.matrix(dat$child)
x3[is.na(x3)]=0
X3<-matrix(data=x3,ncol=5)
估计参数的作用
po.gam=function(para){
#Lambda(i,t)
{for (i in (1:5908)){
for(t in (1:5)){
lambda<-as.matrix(para[1] + para[2]*X1 + para[3]*X2 + para[4]*X3,ncol=5)}}
}
#Sum N(i,t) of t
num.claims.of.t <-numeric(nrow(Y))
{for (i in seq(nrow(Y))){
num.claims.of.t[i] <-sum(Y[i,])}
}
#Sigma Lambda(i,t) terhadap t
num.lambda.of.t<-numeric(nrow(Y))
{for (i in seq(nrow(Y))){
num.lambda.of.t[i]<-sum(lambda[i,])}
}
prod.exp<-numeric(nrow(Y))
{for (i in seq(nrow(Y))){
prod.exp[i]<-prod(lambda[i,]^Y[i,]/factorial(Y[i,]))}
}
#JOINT PROBABILITY OF TIME..
joint.pdf.mvnb<-(prod.exp)*(gamma(num.claims.of.t + (1/para[5]))/gamma(1/para[5]))*(((1/para[5])/(num.lambda.of.t + (1/para[5])))^(1/para[5]))*((num.lambda.of.t + (1/para[5]))^(-num.claims.of.t))
# -LOG LIKELIHOOD
return(-log(prod(joint.pdf.mvnb)))
}
并使用 optim()
start.value <- list(beta0=1,beta1=1,beta2=1,beta3=1,alfa=0.01)
po.gam(start.value) #For checking initial value
结果:
po.gam(start.value)
Error in para[2] * X1 : non-numeric argument to binary operator
解决方法
错误消息试图告诉您,您要乘的不是数字。这是因为 para[2]
不是您想要的数字,而是包含您想要的数字的列表。
start.value <- list(beta0=1,beta1=1,beta2=1,beta3=1,alfa=0.01)
start.value[2]
#Output:
> start.value[2]
$beta1
[1] 1
您想要的是para[[2]]
。这同样适用于其他 para[number]
调用。
> start.value[[2]]
[1] 1