多元线性回归

3

我正在尝试使用GLSMultipleLinearRegression(来自apache commons-math软件包)进行多元线性回归。它需要一个协方差矩阵作为输入 - 我不确定如何计算它们。我有一个因变量数组和3个自变量数组。
有什么想法如何计算协方差矩阵吗?

注意:我有每个3个自变量的200个项目。

谢谢
Bharani


你有200个方程需要解决吗? - Bob Cross
不,它是一个方程,如 y=bX+u,其中我有3个独立的输出变量(x1、x2和x3,就像你的例子中一样)。向量中的项目数为200,因此y是一个包含200个元素的向量,x1、x2和x3也是如此。 - Bharani
@Bharani,好的,所以你有一个方程式的200个候选解,其中有三个自变量和一个因变量。 - Bob Cross
6个回答

4
如果你不知道误差之间的协方差,可以采取迭代方法。首先使用普通最小二乘法计算误差和误差之间的协方差。然后使用计算出的协方差矩阵应用广义最小二乘法(GLS),并重新估计协方差矩阵。继续使用具有新协方差矩阵的GLS进行迭代,直到收敛为止。这里是一个示例的链接及相关讨论,其中讨论了加权和迭代加权最小二乘法的情况,其中误差之间的相关性不像GLS假设的那样明确。(.pdf警告)链接

我看到这个例子是使用R语言的。虽然我也可以用Java做同样的事情,但时间可能是限制因素。我希望Commons库内置了对此的支持,但看起来它们没有。 - Bharani

2
刚才看到了 Flanagan 库,可以直接实现这个功能。同时从Commons用户列表中收到一封邮件,说Commons Math目前不支持FGLS - 即协方差矩阵的自动估计。
-Bharani

1

你尝试过直接从你的数据创建协方差矩阵吗?

new Covariance().computeCovarianceMatrix(data)

根据评论中的信息,我们知道有3个自变量、1个因变量和200个样本。这意味着您将拥有一个包含4列和200行的数据数组。最终结果将类似于以下内容(为了尝试解释我的意思而明确地输入所有内容):

double [] data = new double [4][];
data[0] = new double[]{y[0], x[0][0], x[1][0], x[2][0]};
data[1] = new double[]{y[1], x[0][1], x[1][1], x[2][1]};
data[2] = new double[]{y[2], x[0][2], x[1][2], x[2][2]};
// ... etc.
data[199] = new double[]{y[199], x[0][199], x[1][199], x[2][199]};
Covariance covariance = new Covariance().computeCovarianceMatrix(data);
double [][] omega = covariance.getCovarianceMatrix().getData();

然后,当你进行实际回归时, 你会有你的协方差矩阵:

MultipleLinearRegression regression = new GLSMultipleLinearRegression();
// Assumes you put your independent variables in x and dependent in y
// Also assumes that you made your covariance matrix as shown above 
regression.addData(y, x, omega); // we do need covariance

是的,我尝试过那样做了 - 我的问题是每个X有200个项目,所以它不是一个方阵,GLS抱怨说org.apache.commons.math.MathRuntimeException$4: dimension mismatch 200 != 3抱歉,我应该在问题陈述中提到这一点,我现在会进行编辑。 - Bharani

1
如果您对误差之间的协方差没有任何概念,我建议使用普通最小二乘法(OLS)而不是广义最小二乘法(GLS)。这相当于将单位矩阵作为协方差矩阵。该库似乎在 OLSMultipleLinearRegression 中实现了OLS。

我最初尝试了OLS,但看起来GLS是我们需要的,我应该找到一些估计协方差的方法。 - Bharani

0

@Mark Lavin

你首先会使用普通最小二乘法,计算误差和误差之间的协方差。

我有点困惑...因为我们只有一个响应变量,残差误差应该是一维变量。那么误差的协方差矩阵在哪里适用?


从OLS转到GLS,您打破了误差独立正态分布的假设:var e ~ N(0, s^2I),其中I是单位矩阵。相反,您假定存在协方差矩阵C,使得var e ~ N(0, s^2C)。然后,您将最小化(y-Xb)'C^(-1)(y-Xb),而不是(y-Xb)'(y-Xb)。在这里,C是大小等于回归变量数量的方阵。 GLS的问题在于,您必须已经知道C,还要考虑到一个乘法常数。 - Mark Lavin

0
你需要将三个随机独立变量作为列向量组织成一个矩阵:x1、x2、x3(N),其中每一行是一个观测值(M)。这将是一个MxN矩阵。
然后,你可以将这个数据矩阵输入到Apache提供的协方差例程中,例如:Covariance.computeCovarianceMatrix(RealMatrix matrix)。

是的 - 显然已经完成了,GLS所需的协方差矩阵是MxM - 通过单元测试尝试一下,你会得到我已经提到过的错误(在这种情况下,您将得到一个维度不匹配的错误,说200!= 3) - Bharani
所以你想要一个3x3的协方差矩阵,对吧?在这种情况下N=3,M=200?还是反过来?C = Covariance.computeCovarianceMatrix(RealMatrix myData)。C应该是一个3x3的矩阵,然后你将其插入GLS。 - user171147

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接