## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 7,
  fig.height = 4.5
)
options(hcinfer.use_emoji = FALSE)

## -----------------------------------------------------------------------------
library(hcinfer)

schools <- PublicSchools2
schools$income_scaled <- schools$income / 10000

fit <- lm(expenditure ~ income_scaled + south, data = schools)
fit

## -----------------------------------------------------------------------------
gls_fit <- gls_mult(fit)
gls_fit

## -----------------------------------------------------------------------------
summary(gls_fit)

## -----------------------------------------------------------------------------
coef(gls_fit)                        # mean coefficients
coef(gls_fit, model = "dispersion")  # log-variance coefficients

## -----------------------------------------------------------------------------
vcov(gls_fit)                        # mean covariance
vcov(gls_fit, model = "dispersion")  # dispersion covariance

## -----------------------------------------------------------------------------
tests(gls_fit)
confint(gls_fit)

## -----------------------------------------------------------------------------
head(fitted(gls_fit))
head(gls_fit$fitted_variances)   # estimated conditional variances
head(gls_fit$weights)            # GLS weights exp(-eta)

## -----------------------------------------------------------------------------
two_step <- gls_mult(fit, estimator = "two_step")
coef(two_step)

## -----------------------------------------------------------------------------
data.frame(
  term = names(coef(gls_fit)),
  ml = coef(gls_fit),
  two_step = coef(two_step)
)

## -----------------------------------------------------------------------------
gls_income <- gls_mult(fit, variance = ~ income_scaled)
coef(gls_income, model = "dispersion")

## -----------------------------------------------------------------------------
full <- gls_mult(fit)                       # variance ~ income + south
income_only <- gls_mult(fit, variance = ~ income_scaled)
homoskedastic <- gls_mult(fit, variance = ~ 1)
AIC(full, income_only, homoskedastic)
BIC(full, income_only, homoskedastic)

## -----------------------------------------------------------------------------
data.frame(
  term = names(coef(fit)),
  ols = sqrt(diag(vcov(fit))),
  fgls_ml = sqrt(diag(vcov(gls_fit))),
  hcbeta = sqrt(diag(vcov(hcinfer(fit, type = "hcbeta")))),
  hc3 = sqrt(diag(vcov(hcinfer(fit, type = "hc3"))))
)

