1

我正在尝试运行 GMM 估计,其中包括正常 CDF 的积分,函数和积分区间中都存在参数。代码要点如下:

g1 <- function(b,x){
  e <- b[1] +b[2]*x$x1
  r <- e + b[3]*x$x2
  n <- b[4]+b[5]*x$x3
  ncdf <- function(z){
    return((pnorm((log(z)-b[6]*log(e))/(b[7]/x$x4)))^n)
  }
  m1 <- x$y-integrate(ncdf,-Inf,r)/ncdf(r)
  f <- cbind(m1)
  return(f)
}

init = rep(0,7)

res<-gmm(g1,bids,init)

对于细微的变化,我要么得到

Error in integrate(ncdf, -Inf, r) : 'bound' must be of length one 

或者

Error in integrate(ncdf, -Inf, r) : a limit is NA or NaN

帮助将不胜感激。提前致谢。

4

1 回答 1

1

所以我能够通过使用来解决它Vectorize()

g1 <- function(b,x){
  e <- b[1] +b[2]*x$x1
  r <- e + b[3]*x$x2
  n <- b[4]+b[5]*x$x3
  ncdf <- function(a,b,c,d){
    return((pnorm((a-b)/c))^d)
  }

  intn <- function(z){
    return(integrate(ncdf,-Inf,z,b=m,c=s,d=n)$value)
  }

  vint <- Vectorize(intn)

  d <- b[6]*x$x6
  s <- b[7]*x$x7

  m1 <- x$y-vint(r)/ncdf(r,m,s,n)
  f <- cbind(m1)
  return(f)
}
于 2017-08-07T23:56:47.707 回答