2017-08-06 141 views
1

我试图运行一个GMM估计,其中包括正常CDF的积分,其参数同时存在于函数和积分区间中。代码为的要点如下:R中的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 

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

+0

我刚刚意识到整合()不能与载体工作。将尝试与apply()。 – SeamusX

回答

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) 
}