星期三, 七月 13, 2011

R语言中实现可行广义最小二乘(FGLS)回归

线性回归中经常会遇到异方差的问题。如果干扰项的方差与自变量之间存在某种关系,那么在这种前提下,一种补救方法就是利用加权最小二乘(WLS)。

首先利用OSL对模型进行回归,得到模型残差,以残差的平方来代替干扰项的方差。
然后,将残差的平方的对数做因变量,将自变量的对数做自变量,进行第二次回归,得到的系数即为自变量的幂h。最后,构造权重(1/x^(h/2)),手动操作时,需要在原模型两边分别除以权重,构造新的方程进行回归。但在R语言中进行回归时,可以直接利用weight参数,将weight=1/x^h 即可。


代码如下:
#首先载入数据,进行初步回归
library(AER)
data("Journals")
journals <- Journals[, c("subs", "price")]
journals$citeprice <- Journals$price/Journals$citations
jour_lm <- lm(log(subs) ~ log(citeprice), data = journals)
summary(jour_lm)

#再进行辅助回归,求出h
auxreg <- lm(log(residuals(jour_lm)^2) ~ log(citeprice),
 data = journals)
h=coef(auxreg)[2]

#利用WSL方法求出最终结果
jour_fgls1 <- lm(log(subs) ~ log(citeprice),
 weights = 1/citeprice^h, data = journals)
summary(jour_fgls1)

可以用这种思路,将新得到的回归残差再次作辅助回归,反复迭代后得出较为精确的结果

gamma2i <- coef(auxreg)[2]
gamma2 <- 0
 while(abs((gamma2i - gamma2)/gamma2) > 1e-7) {
 gamma2 <- gamma2i
fglsi <- lm(log(subs) ~ log(citeprice), data = journals,
 weights = 1/citeprice^gamma2)
gamma2i <- coef(lm(log(residuals(fglsi)^2) ~
log(citeprice), data = journals))[2]}
jour_fgls2 <- lm(log(subs) ~ log(citeprice), data = journals,
 weights = 1/citeprice^gamma2)
summary(jour_fgls2)

本文例子来自于《Applied Econometrics with R》一书

3 条评论:

  1. 谢谢!学习了很多

    回复删除
  2. 请教下博主WSL在多元回归时weights该怎么写啊

    回复删除
    回复
    1. 多元回归时weights的写法是和上面一样的,关键是判断干扰项的方差与哪个自变量之间存在关系

      删除