R:二元运算符的非数字参数

问题描述

我的目的是从面板数据中估计 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