--- title: "Using HCbeta" vignette: > %\VignetteIndexEntry{Using HCbeta} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 4.5 ) options(hcinfer.use_emoji = FALSE) ``` This vignette shows how to run HCbeta on the `Crime2009` dataset, the 2009 U.S. crime application from the HCbeta paper, which regresses the murder rate on high-school graduation, poverty, and single-parent household rates. It inspects HCbeta's method parameters and diagnostic quantities, and runs a small sensitivity check on its tuning controls. It assumes the introduction (`vignette("introduction", package = "hcinfer")`). ## Run HCbeta Fit an OLS model and request HCbeta explicitly. This is equivalent to the default `hcinfer(fit)` call. ```{r run-hcbeta} library(hcinfer) fit <- lm(murder ~ hs_grad + poverty + single, data = Crime2009) result <- hcinfer(fit, type = "hcbeta") summary(result) ``` ## Inspect HCbeta parameters HCbeta stores its six user-facing controls and eight estimated quantities in `method_params`. The adjustable controls are `c1`, `c2`, `lower`, `upper`, `a_max`, and `b_max`. The remaining entries are computed from the fitted design by method of moments and shrinkage. ```{r hcbeta-method-params} result$method_params ``` The table below maps every printed name to its role and, where applicable, to the corresponding mathematical symbol. | Entry | Symbol | Meaning | |-------|--------|---------| | `c1` | $c_1$ | Exponent constant (default 7) | | `c2` | $c_2$ | Exponent decay rate (default 0.75) | | `lower` | | Lower truncation limit for $w_t$ (default 0.01) | | `upper` | | Upper truncation limit for $w_t$ (default 0.99) | | `a_max` | $A_{\max}$ | Upper cap for $\tilde a$ (default 10000, valid range $[50,\;25000]$) | | `b_max` | $B_{\max}$ | Upper cap for $\tilde b$ (default 10000, valid range $[50,\;25000]$) | | `mu_hat` | $\hat\mu$ | Mean of the truncated leverage complements $w_t$ | | `s2_w` | $s_w^2$ | Variance of $w_t$ | | `phi_hat` | $\hat\phi$ | Estimated dispersion | | `a_hat` | $\hat a$ | Raw moment shape for the Beta family | | `b_hat` | $\hat b$ | Raw moment shape for the Beta family | | `zeta` | $\zeta$ | Shrinkage weight toward $a = b = 1$ | | `a_tilde` | $\tilde a$ | Adjusted shape after shrinkage and floor | | `b_tilde` | $\tilde b$ | Adjusted shape after shrinkage and floor | A fixed shape floor $\varepsilon = 0.01$ is applied via $\max(\cdot,\;\varepsilon)$ after shrinkage and before the $\min(\cdot,\;A_{\max})$ caps. It is part of the HCbeta definition, not a user argument, and is not accepted through `...`. It is distinct from `lower`, which truncates the leverage complements $w_t$ before the Beta CDF is evaluated. ## Inspect leverage and weights HCbeta, like the other estimators, stores leverage values and robust weights. This table shows the observations with the largest leverages. ```{r hcbeta-leverage-top5} diagnostics <- data.frame( state = Crime2009$state[as.integer(result$observation)], leverage = unname(result$leverage), weight = unname(result$weights), residual = unname(result$residuals) ) head(diagnostics[order(-diagnostics$leverage), ], 5) ``` You can also sort by robust weight to see which observations contribute most to the variance estimate. ```{r hcbeta-weight-top5} head(diagnostics[order(-diagnostics$weight), ], 5) ``` The covariance object can be plotted directly to display adjustment factors against leverages. ```{r hcbeta-weight-plot, fig.alt = "Scatterplot of HCbeta adjustment factors against leverage values for the Crime2009 model."} plot(vcov_hc(fit, type = "hcbeta")) ``` ## Run a sensitivity check All six adjustable HCbeta controls can be passed through `...`. The sensitivity check below compares the default result with a small set of alternative settings, each varying only declared controls so that the interpretation remains tied to HCbeta. For every setting it reports the robust standard error, p-value, and confidence interval for the focus coefficient `single`, together with the largest adjustment factor. ```{r hcbeta-sensitivity} settings <- list( default = list(), stronger_exponent = list(c1 = 10), faster_decay = list(c2 = 1.0), tighter_truncation = list(lower = 0.05, upper = 0.90), capped_shapes = list(a_max = 50, b_max = 50) ) sensitivity <- lapply(names(settings), function(setting) { res <- do.call(hcinfer, c(list(fit, type = "hcbeta"), settings[[setting]])) row <- tests(res, parm = "single") ci <- confint(res, parm = "single") data.frame( setting = setting, std_error = row$std_error, p_value = row$p_value, conf_low = ci$conf_low, conf_high = ci$conf_high, max_weight = max(res$weights) ) }) sensitivity <- do.call(rbind, sensitivity) sensitivity ``` In this model the exponent constants `c1` and `c2` and the truncation window drive the HCbeta correction: raising `c1` to 10 pushes the robust SE upward, while increasing `c2` to 1.0 pulls it downward. Tightening the truncation bounds to $[0.05,\;0.90]$ also changes the result by restricting the range of leverage complements fed to the Beta CDF. In contrast, the shape caps `a_max` and `b_max` do not change the output when set to their minimum admissible value of 50, because the adjusted shapes $\tilde a \approx 3.4$ and $\tilde b \approx 0.7$ sit far below that floor. This illustrates a practical guardrail: when the design lacks extreme leverage complements, the caps remain inactive and the inference is driven primarily by the exponent and truncation settings.