我是Stackoverflow的新手,这篇文章可能非常基础。我使用"gmm"包时遇到意外的"索引列表外"错误。更具体地说,我正在使用该包的凝胶函数,我需要提供参数"g",这是一个返回矩阵的函数。我传递给"g"参数的函数本身工作得很好,但不能作为凝胶函数的参数。我知道有一个非常密切相关的问题:https://stackoverflow.com/search?q=index+out+of+bounds+r但是,这些都没有帮助我解决我面临的问题。我附上一个可重现的例子。
提前谢谢。
rm(list=ls())
install.packages("gmm")
library(mvtnorm)
library(gmm)
#set.seed(1)
########################################
#functions declaration and construction#
########################################
moment.function <- function(data,alpha) {
instrus.index <- length(alpha)+1
data<-as.matrix(data)
nbr.instrus <- ncol(data)-instrus.index
data1 <-data[,1]-data[,(2:instrus.index)]%*%alpha
data1<-matrix(rep(data1,nbr.instrus),nrow(total.data),nbr.instrus)
g.fun <- data[,-(1:instrus.index)]*data1
#g.fun <- t(data[,-(1:instrus.index)])%*%(data[,1]-data[,(2:instrus.index)]%*%alpha)
return(g.fun)
}
##################
#DGP construction#
##################
#set params
n <- 70
beta1 <- 1
beta2 <- 1
beta.first.stage <- 0.1
rho <- 0.1
cov.exo.instrus <- 0.3
sigma2.epsilon <- 0.1
sigma2.V <- 0.1
sigma2.simus <-0.01
Sigma <- rbind(c(1,cov.exo.instrus,cov.exo.instrus),
c(cov.exo.instrus,1,cov.exo.instrus),
c(cov.exo.instrus,cov.exo.instrus,1))
#generate obs according to DGP
#instruments and exogenous covariates
X <- rmvnorm(n, rep(0,3), Sigma)
#two disturbance terms
epsilon<-rnorm(n,0,sigma2.epsilon)
V <- rnorm(n,0,sigma2.V)
#endogenous regressor
Y2 <- beta.first.stage*(X[,2]+X[,3])+V
#outcome variable with structural error term
#h()=()^2
Y1 <- beta1*X[,1]+beta2*(Y2^2+sigma2.V-V^2-2*beta.first.stage*(X[,2]+X[,3])*V)+epsilon
#matrices for the finite-dimensional case
second.stage.vars <- cbind(Y1,X[,1],Y2^2)
total.data <- cbind(second.stage.vars,X)
###################################
#simulations in the finite-dimensional case
#with gel there is a problem
gel(moment.function, total.data, c(1.5, 1.5))
#moment.function alone has no problem
moment.function(total.data,c(1.5,1.5))
gmm
函数期望数据和参数的参数相反,即您的矩函数应该是
moment.function <- function(alpha, data) {
## function body
}
有了这个变化,你的例子对我有用。