我正在尝试使用R中的广义矩方法训练回归模型。我有3个内生回归变量,这些变量与我所知的6个外生变量相关。
为了进行培训,我将数据设置在data.matrix dat
中。第一列为y,第二列均为1,第三至第八列为工具x1-x6。第9到第11列是回归变量(z1,z2和z1 * z2)。
然后我将时刻条件设置如下:
moments <- function(theta, data) {
y <- as.numeric(data[, 1])
x <- data.matrix(data[, c(2,3:8)])
z <- data.matrix(data[, c(2,9,10,11)])
m <- x * as.vector((y - z %*% theta))
return(cbind(m))
}
然后我尝试训练我的模型:
gmm_model <- gmm(
g = moments,
x = dat,
t0 = (lm(y ~ z1 + z2 + z1:z2,
data=dat))$coefficients
)
运行此命令时出现错误:
model order: 1 singularities in the computation of the projection matrix results are only valid up to model order 0Error in AA %*% t(X) : requires numeric/complex matrix/vector arguments
该错误表明x的秩不足以估计与z对应的变量的系数。
但是当我检查Matrix::rankMatrix(dat[,3:8])
告诉我我的x排名为5,而Matrix::rankMatrix(dat[2,9,10,11])
告诉我我的z排名为4时。rankMatrix(t(x) %*% z )
得出的结果是4。我的GMM。 我在做什么错了?
我也尝试使用pgmm
中的plm
,但是我的数据实际上只是横截面(而不是面板数据集),当我尝试对每个人进行多次观察时,我遇到了错误使用它。
dat
如下:
y i x1 x2 x3 x4 x5 x6 z1 z2 z1*z2
[1,] 0 1 31 0 123 0.12 123456 1234567 0 0.2954545 0
[2,] 0 1 44 0 123 0.12 123456 1234567 0 0.1555556 0
[3,] 0 1 31 0 123 0.12 123456 1234567 0 0.2325581 0
[4,] 0 1 47 0 123 0.12 123456 1234567 0 0.2537313 0
[5,] 0 1 33 0 123 0.12 123456 1234567 0 0.1500000 0
[6,] 0 1 49 0 123 0.12 123456 1234567 0 0.2553191 0
x1是[30-100]中的整数 x2是二进制0,1 x3取两个值 x4取两个值 x5取两个值 x6取两个值
z1是二进制0,1 z2在[0,1]中是连续的
答案 0 :(得分:0)
尝试了多种不同的方法之后,有效的方法是删除x变量,直到x变量的数量成为矩阵的秩,包括所有列的矩阵:gmm
似乎不喜欢让瞬间条件下使用的外生工具矩阵中的任何奇异点。明确地说,当我更改为这组矩条件时,相同的gmm调用起作用了:
moments <- function(theta, data) {
y <- as.numeric(data[, 1])
x <- data.matrix(data[, c(2,3,4,5,6)]) # this is rank 5 still
z <- data.matrix(data[, c(2,9,10,11)]) # rank 4
m <- x * as.vector((y - z %*% theta))
return(cbind(m))
}