R语言GMM估计报错维度不符:自定义矩限制函数下的变量维度问题咨询
解决GMM估计中"Incorrect number of dimensions"报错的维度问题
这个报错几乎都是因为你的自定义矩函数g的输出维度不符合gmm包的要求,或者数据传递时的维度处理出错了。我用一个简单的学习示例来拆解问题:
首先,明确gmm包对矩函数的核心要求:
自定义的
g(theta, data)必须返回一个N×K的矩阵——其中N是你的观测样本量,K是你设定的矩条件数量。每一行对应一个样本的所有矩条件,每一列对应一个矩条件。
最常见的错误写法(踩坑示例)
比如我们要估计正态分布的均值mu和方差sigma²,矩条件是E(X - mu) = 0和E((X - mu)² - sigma²) = 0。新手容易写出这样的错误函数:
library(gmm) set.seed(123) x <- rnorm(100, mean = 2, sd = 1) # 错误的矩函数 g_wrong <- function(theta, x) { mu <- theta[1] sigma2 <- theta[2] # 返回的是长度为200的向量,不是100×2的矩阵! c(x - mu, (x - mu)^2 - sigma2) } # 调用就会报错:Incorrect number of dimensions gmm(g_wrong, x, c(1, 1))
这里的问题是用c()把两个向量拼接成了一个长向量,而gmm需要的是每行对应一个样本、每列对应一个矩条件的矩阵。
正确的写法(修正维度)
把c()换成cbind(),让输出变成N×K的矩阵:
# 正确的矩函数 g_right <- function(theta, x) { mu <- theta[1] sigma2 <- theta[2] # 返回100行2列的矩阵,每行是一个样本的两个矩条件 cbind(x - mu, (x - mu)^2 - sigma2) } # 成功运行 result <- gmm(g_right, x, c(1, 1)) summary(result)
其他可能的维度问题
- 矩函数返回K×N矩阵而非N×K:如果你的函数不小心返回了行是矩条件、列是样本的矩阵,记得用
t()转置一下。 - 数据传递方式错误:如果你的模型用到多个变量(比如回归中的X和Y),不要分开传递参数,要把数据合并成一个矩阵或数据框传入。比如:
# 多变量场景的正确数据传递 y <- 1 + 2*x + rnorm(100) data <- cbind(y, x) g_reg <- function(theta, data) { y <- data[,1] x <- data[,2] beta0 <- theta[1] beta1 <- theta[2] # 矩条件:残差 以及 残差×x cbind(y - beta0 - beta1*x, (y - beta0 - beta1*x)*x) } gmm(g_reg, data, c(0, 0)) - 初始参数长度不匹配:如果你的矩条件是K个,初始参数向量
theta0的长度必须等于待估参数的数量(注意不是K,除非是恰好识别模型),不过这个通常会报另一个错,但也可能间接引发维度问题。
总之,核心检查点就是:运行g(theta0, your_data)看看输出是不是N行K列的矩阵——只要这个对了,大部分维度报错就解决了。
内容的提问来源于stack exchange,提问作者skoestlmeier
相关产品推荐
相关产品推荐

