我有两个不同的数据集。它们中的每一个代表我的两个投资组合中的一个投资组合。
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)
祝你好运, 西蒙
答案 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