R:为2个不同的数据集准备waldtest

时间:2018-03-12 20:40:25

标签: r linear-regression

我有两个不同的数据集。它们中的每一个代表我的两个投资组合中的一个投资组合。

y(p)作为因变量,x1(p),x2(p),x3(p),x4(p)作为自变量。 (p)表示投资组合特定值。每个变量的第1列代表投资组合1,第2列代表投资组合2.

回归方程为:

y(p)=∝(p)+ 1(p)*x1(p)+2(p)*x2(p)+3(p)*x3(p)+4(p)*x4(p) 

到目前为止,我所做的是为R中的每个投资组合实施单独的回归模型:

lm1 <- lm(y[,1]~x1[,1]+x2[,1]+x3[,1]+x4[,1])
lm2 <- lm(y[,2]~x1[,2]+x2[,2]+x3[,2]+x4[,2])

我的目标是比较两种回归模型的两个截距。 在这个比较的范围内,我需要测试这些截距的联合意义。据我所知,使用 wald测试应该是合适的。

如果我使用lmtest-package中的waldtest-function它不起作用。 显然,因为两个模型的响应变量不一样。

library(lmtest)
waldtest(lm1,lm2)

In waldtest.default(object, ..., test = match.arg(test)) :
  models with response "y[, 2]" removed because response differs from model 1

到目前为止,我尝试过的所有变通办法都没有用,例如R: Waldtest: "Error in solve.default(vc[ovar, ovar]) : 'a' is 0-diml"

我的猜测是回归需要以不同的方式完成,以解决有关 waldtest的问题。

这导致了我的问题:

是否有可能在一个模型中进行回归,仍会生成特定于投资组合的截距和系数?(我认为,这将解决waldtest函数的问题。)< / p>

任何建议或建议将不胜感激。

以下数据可用于可重现的示例:

y=matrix(rnorm(10),ncol=2)
x1=matrix(rnorm(10),ncol=2)
x2=matrix(rnorm(10),ncol=2)
x3=matrix(rnorm(10),ncol=2)
x4=matrix(rnorm(10),ncol=2)

lm1 <- lm(y[,1]~x1[,1]+x2[,1]+x3[,1]+x4[,1])
lm2 <- lm(y[,2]~x1[,2]+x2[,2]+x3[,2]+x4[,2])
library(lmtest)
waldtest(lm1,lm2)

祝你好运, 西蒙

1 个答案:

答案 0 :(得分:1)

以下是测试拦截平等的三种方法。第二个是对this问题的接受答案的实现,而另外两个是在不同假设下对上述问题的第二个答案的实现。

n <- 5
y <- matrix(rnorm(10), ncol = 2)
x <- matrix(rnorm(10), ncol = 2)

首先,我们可能确实只用一个模型进行测试。为此,我们创建了一个连接y[, 1]y[, 2]的新向量Y.至于自变量,我们创建一个块对角矩阵,其中左上方块的一个模型的回归量和右下块的另一个模型的回归量。最后,我创建了一个指示隐藏模型的组因子。因此,

library(Matrix)
Y <- c(y)
X <- as.matrix(bdiag(x[, 1], x[, 2]))
G <- factor(rep(0:1, each = n))

现在无限制的模型是

m1 <- lm(Y ~ G + X - 1)

受限制的

m2 <- lm(Y ~ X)

测试拦截等式给出

library(lmtest)
waldtest(m1, m2)
# Wald test
#
# Model 1: Y ~ G + X - 1
# Model 2: Y ~ X
#   Res.Df Df      F Pr(>F)
# 1      6                 
# 2      7 -1 0.5473 0.4873

因此,正如预期的那样,我们不能拒绝他们的平等。然而,该解决方案的一个问题是,它就像分别估计两个模型,但假设误差在两者中具有相同的方差。此外,我们不允许错误之间的互相关。

其次,我们可以通过估算两个单独的模型并采用如下的Z检验来放宽相同误差方差的假设。

M1 <- lm(y[, 1] ~ x[, 1])
M2 <- lm(y[, 2] ~ x[, 2])

Z <- unname((coef(M1)[1] - coef(M2)[1]) / (coef(summary(M1))[1, 2]^2 + coef(summary(M2))[1, 2])^2)
2 * pnorm(-abs(Z))
# [1] 0.5425736

导致相同的结论。

最后,我们可以以这种方式使用SUR,允许依赖于模型的错误差异以及同期错误交叉依赖(在您的情况下可能不是必需的,这对您是什么类型的数据很重要)使用)。为此,我们可以使用systemfit包,如下所示:

library(systemfit)
eq1 <- y[, 1] ~ x[, 1]
eq2 <- y[, 2] ~ x[, 2]
m <- systemfit(list(eq1, eq2), method = "SUR")

在这种情况下,我们也可以执行Wald测试:

R <- matrix(c(1, 0, -1, 0), nrow = 1) # Restriction matrix
linearHypothesis(m, R, test = "Chisq")
# Linear hypothesis test (Chi^2 statistic of a Wald test)
# 
# Hypothesis:
# eq1_((Intercept) - eq2_(Intercept) = 0
#
# Model 1: restricted model
# Model 2: m
#
#   Res.Df Df  Chisq Pr(>Chisq)
# 1      7                     
# 2      6  1 0.3037     0.5816