如何从statsmodels中的WLS回归的2D参数获取测试预测

1 投票
1 回答
1477 浏览
提问于 2025-04-18 04:46

我正在逐步调整使用 WLS 回归函数 的参数,使用的是 statsmodels 库。

我有一个 10 行 3 列的数据集 X,声明方式如下:

X = np.array([[1,2,3],[1,2,3],[4,5,6],[1,2,3],[4,5,6],[1,2,3],[1,2,3],[4,5,6],[4,5,6],[1,2,3]])

这是我的数据集,我还有一个 10 行 2 列的 endog 向量,长得像这样:

z =
[[  3.90311860e-322   2.00000000e+000]
 [  0.00000000e+000   2.00000000e+000]
 [  0.00000000e+000  -2.00000000e+000]
 [  0.00000000e+000   2.00000000e+000]
 [  0.00000000e+000  -2.00000000e+000]
 [  0.00000000e+000   2.00000000e+000]
 [  0.00000000e+000   2.00000000e+000]
 [  0.00000000e+000  -2.00000000e+000]
 [  0.00000000e+000  -2.00000000e+000]
 [  0.00000000e+000   2.00000000e+000]]

现在在导入了 import statsmodels.api as sm 之后,我做了以下操作:

g = np.zeros([3, 2]) # g(x) is a function that will store the regression parameters
mod_wls = sm.WLS(z, X)
temp_g = mod_wls.fit()
print temp_g.params

然后我得到了这个输出:

[[ -5.92878775e-323  -2.77777778e+000]
 [ -4.94065646e-324  -4.44444444e-001]
 [  4.94065646e-323   1.88888889e+000]]

之前,在 这个问题的回答 中,我能够使用 numpy.dot 来预测测试数据 X_test 的值,像这样:

np.dot(X_test, temp_g.params)

我觉得这很简单,因为 endog 向量 y 是一维数组。但是当我的 endog 向量在这种情况下是二维的 z 时,这个过程是怎么工作的呢?当我尝试用一维版本中使用的那行代码时,我遇到了以下错误:

   self._check_integrity()
  File "C:\Users\app\Anaconda\lib\site-packages\statsmodels\base\data.py", line 247, in _check_integrity
    raise ValueError("endog and exog matrices are different sizes")
ValueError: endog and exog matrices are different sizes

1 个回答

2

np.dot(X_test, temp_g.params) 这个操作应该还是可以用的。

在某些情况下,你需要检查一下矩阵的方向,有时候需要进行转置。

不过,predict 以及大多数其他结果的方法是无法使用的,因为模型假设因变量 z 是一维的。

问题又回到了你想要做什么?

如果你想独立地处理 z 的每一列,那么就要逐列进行,这样每个 y 才是一维的。

for y in z.T: res = WLS(y, X).fit()

z.T 让你可以逐列进行操作。

在其他情况下,我们通常会把模型堆叠起来,使得 y 是一维的,第一部分是 z[:,0],第二部分是 z[:,1]。设计矩阵或者解释变量的矩阵也需要相应地扩展。

对于多元因变量的支持正在开发中,但还需要一些时间才能准备好。

撰写回答