## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", eval = TRUE ) local({ hook_output <- knitr::knit_hooks$get("output") knitr::knit_hooks$set(output = function(x, options) { paste0("\n
Toggle to see the output\n\n", hook_output(x, options), "\n
\n") }) }) library(fracreg) ## ----load-package------------------------------------------------------------- library(fracreg) ## ----fracreg------------------------------------------------------------------ ### Empirical 401(k) Examples data("fracreg_k401k") y <- fracreg_k401k$prate X <- cbind(mrate = fracreg_k401k$mrate, age = fracreg_k401k$age, totemp = fracreg_k401k$totemp, sole = fracreg_k401k$sole) # 1P Model mod <- fracreg(y, X, type="1P", linkfrac="logit") summary(mod) # 1P Model reporting odds ratios and 99% confidence intervals mod <- fracreg(y, X, type="1P", linkfrac="logit", or=TRUE, level=0.99) summary(mod) # 2P Model (modelling mass at 1) mod <- fracreg(y, X, type="2P", inflation=1, linkbin="logit", linkfrac="logit") summary(mod) # 3P Model (inject artificial 0s for demonstration) y_3p <- y; y_3p[1:50] <- 0 mod <- fracreg(y_3p, X, type="3P", linkbin=c("logit","logit"), linkfrac="logit") summary(mod) ### Simulated Examples set.seed(123) N <- 1000 x1 <- rnorm(N) x2 <- runif(N) # Generating a fractional dependent variable with inflation at 0 and 1 XB <- -0.5 + 0.8 * x1 + 1.2 * x2 + rnorm(N) y_latent <- exp(XB) / (1 + exp(XB)) y <- y_latent # Inflate at boundaries y[y_latent < 0.2] <- 0 y[y_latent > 0.8] <- 1 X <- cbind(x1 = x1, x2 = x2) # fracreg estimation of a logit fractional response model mod <- fracreg(y, X, type="1P", linkfrac="logit") summary(mod) ## ----fracreg_2pbin------------------------------------------------------------ # Estimate the binary logit component mod <- fracreg(y, X, type="2Pbin", inflation=0, linkbin="logit") summary(mod) ## ----fracreg_2pfrac----------------------------------------------------------- # Estimate the fractional component using a probit link mod <- fracreg(y, X, type="2Pfrac", inflation=0, linkfrac="probit") summary(mod) ## ----fracreg_2p_joint--------------------------------------------------------- # Estimate both components jointly mod <- fracreg(y, X, type="2P", inflation=0, linkbin="cloglog", linkfrac="logit") summary(mod) ## ----fracreg_3p_simulated----------------------------------------------------- # Three-part double-inflated model mod <- fracreg(y, X, type="3P", linkbin=c("logit","probit"), linkfrac="logit") summary(mod) ## ----fracreg-pe--------------------------------------------------------------- ### Empirical 401(k) Examples data("fracreg_k401k") y <- fracreg_k401k$prate X <- cbind(mrate = fracreg_k401k$mrate, age = fracreg_k401k$age, totemp = fracreg_k401k$totemp, sole = fracreg_k401k$sole) m <- fracreg(y, X, type="1P", linkfrac="logit") pe_res <- fracreg.pe(m) summary(pe_res) ### Simulated Examples N <- 250 u <- rnorm(N) X <- cbind(rnorm(N),rnorm(N)) dimnames(X)[[2]] <- c("X1","X2") ym <- exp(X[,1]+X[,2]+u)/(1+exp(X[,1]+X[,2]+u)) y <- rbeta(N,ym*20,20*(1-ym)) y[y > 0.9] <- 1 #Computing average partial effects for a logit fractional response model mod <- fracreg(y,X,linkfrac="logit",table=FALSE) pe_res <- fracreg.pe(mod) summary(pe_res) ## ----fracreg_pe_2p------------------------------------------------------------ # Compute average partial effects for a binary logit + fractional probit two-part model mod <- fracreg(y,X,linkbin="logit",linkfrac="probit",type="2P",inf=1,table=FALSE) pe_res <- fracreg.pe(mod) summary(pe_res) ## ----fracreg_pe_cpe----------------------------------------------------------- # Compute conditional partial effects for X2 at median values mod <- fracreg(y,X,linkfrac="logit",type="2Pfrac",inf=1,table=FALSE) pe_res <- fracreg.pe(mod,APE=FALSE,CPE=TRUE,at="median",which.x="X2") summary(pe_res) ## ----fracreg_pe_3p------------------------------------------------------------ # Compute average partial effects for a three-part double-inflated model y3p <- y y3p[1:20] <- 0 y3p[21:40] <- 1 res3p <- fracreg(y3p,X,linkbin=c("logit","probit"),linkfrac="logit",type="3P",table=FALSE) pe_res <- fracreg.pe(res3p) summary(pe_res) ## ----fracreg-ggoff------------------------------------------------------------ ### Empirical 401(k) Examples data("fracreg_k401k") y <- fracreg_k401k$prate X <- cbind(mrate = fracreg_k401k$mrate, age = fracreg_k401k$age, totemp = fracreg_k401k$totemp, sole = fracreg_k401k$sole) m <- fracreg(y, X, type="1P", linkfrac="logit") ggoff_res <- fracreg.ggoff(m) summary(ggoff_res) ### Simulated Examples N <- 250 u <- rnorm(N) X <- cbind(rnorm(N),rnorm(N)) dimnames(X)[[2]] <- c("X1","X2") ym <- exp(X[,1]+X[,2]+u)/(1+exp(X[,1]+X[,2]+u)) y <- rbeta(N,ym*20,20*(1-ym)) y[y > 0.9] <- 1 #Testing the logit specification of a standard fractional response model #using LM and Wald versions of the GGOFF test, based on 1 or 2 fitted powers of #the linear predictor mod <- fracreg(y,X,linkfrac="logit",table=FALSE) ggoff_res <- fracreg.ggoff(mod,c("Wald","LM")) summary(ggoff_res) ## ----fracreg_ggoff_2pbin------------------------------------------------------ # Test the probit specification of the binary component mod <- fracreg(y,X,linkbin="probit",type="2Pbin",inf=1,table=FALSE) ggoff_res <- fracreg.ggoff(mod,"LR") summary(ggoff_res) ## ----fracreg-reset------------------------------------------------------------ ### Empirical 401(k) Examples data("fracreg_k401k") y <- fracreg_k401k$prate X <- cbind(mrate = fracreg_k401k$mrate, age = fracreg_k401k$age, totemp = fracreg_k401k$totemp, sole = fracreg_k401k$sole) m <- fracreg(y, X, type="1P", linkfrac="logit") reset_res <- fracreg.reset(m) summary(reset_res) ### Simulated Examples N <- 250 u <- rnorm(N) X <- cbind(rnorm(N),rnorm(N)) dimnames(X)[[2]] <- c("X1","X2") ym <- exp(X[,1]+X[,2]+u)/(1+exp(X[,1]+X[,2]+u)) y <- rbeta(N,ym*20,20*(1-ym)) y[y > 0.9] <- 1 #Testing the logit specification of a standard fractional response model #using LM and Wald versions of the RESET test, based on 1 or 2 fitted powers of #the linear predictor mod <- fracreg(y,X,linkfrac="logit",table=FALSE) reset_res <- fracreg.reset(mod,2:3,c("Wald","LM")) summary(reset_res) ## ----fracreg_reset_2pbin------------------------------------------------------ # Test the probit specification of the binary component using LR RESET mod <- fracreg(y,X,linkbin="probit",type="2Pbin",inf=1,table=FALSE) reset_res <- fracreg.reset(mod,3,"LR") summary(reset_res) ## ----fracreg-ptest------------------------------------------------------------ ### Empirical 401(k) Examples data("fracreg_k401k") y <- fracreg_k401k$prate X <- cbind(mrate = fracreg_k401k$mrate, age = fracreg_k401k$age, totemp = fracreg_k401k$totemp, sole = fracreg_k401k$sole) m1 <- fracreg(y, X, type="1P", linkfrac="logit") m2 <- fracreg(y, X, type="1P", linkfrac="probit") ptest_res <- fracreg.ptest(m1, m2) summary(ptest_res) ### Simulated Examples N <- 250 u <- rnorm(N) X <- cbind(rnorm(N),rnorm(N)) dimnames(X)[[2]] <- c("X1","X2") ym <- exp(X[,1]+X[,2]+u)/(1+exp(X[,1]+X[,2]+u)) y <- rbeta(N,ym*20,20*(1-ym)) y[y > 0.9] <- 1 #Testing logit versus loglog specifications for standard fractional #regression models using a LM version of the P test res1 <- fracreg(y,X,linkfrac="logit",table=FALSE) res2 <- fracreg(y,X,linkfrac="loglog",table=FALSE) ptest_res <- fracreg.ptest(res1,res2,"LM") summary(ptest_res) ## ----fracreg_ptest_1p_vs_2p--------------------------------------------------- # Test 1P logit versus 2P logit-probit using Wald P-test res1 <- fracreg(y,X,linkfrac="logit",table=FALSE) res2 <- fracreg(y,X,linkbin="logit",linkfrac="probit",type="2P",inf=1,table=FALSE) ptest_res <- fracreg.ptest(res1,res2,"Wald") summary(ptest_res) ## ----fracreghet--------------------------------------------------------------- ### Empirical 401(k) Examples data("fracreg_k401k") y <- fracreg_k401k$prate X_het <- cbind(mrate = fracreg_k401k$mrate, ltotemp = fracreg_k401k$ltotemp) # fracreghet estimators do not allow exact 1s or 0s y_adj <- y y_adj[y_adj == 1] <- 0.999 # Instrument mrate using age Z_emp <- cbind(age = fracreg_k401k$age, ltotemp = fracreg_k401k$ltotemp) mod <- fracreghet(y_adj, X_het, Z_emp, var.endog = X_het[, "mrate"], type="QMLxv", link="logit") summary(mod) # Compute the same QMLxv estimator reporting Odds Ratios with 90% confidence intervals mod <- fracreghet(y_adj, X_het, Z_emp, var.endog = X_het[, "mrate"], type="QMLxv", link="logit", or=TRUE, level=0.90) summary(mod) ### Simulated Examples set.seed(123) N <- 1000 x1 <- rnorm(N) # Simulating an endogenous variable (var.endog) and an instrument (z1) z1 <- rnorm(N) u <- 0.5 * z1 + rnorm(N) var.endog <- 0.8 * z1 + u y_endog <- exp(0.5 * x1 + 1.2 * var.endog + u) / (1 + exp(0.5 * x1 + 1.2 * var.endog + u)) # Avoid exact 0 or 1 boundaries for some estimators y_endog[y_endog <= 0] <- 0.01 y_endog[y_endog >= 1] <- 0.99 X <- cbind(x1 = x1, var.endog = var.endog) Z <- cbind(x1 = x1, z1 = z1) # Exogeneity (assuming var.endog is exogenous for comparison), GMMx estimator mod <- fracreghet(y = y_endog, x = X, type = "GMMx", link = "logit") summary(mod) ## ----fracreghet_gmmz---------------------------------------------------------- # Endogeneity, GMMz estimator mod <- fracreghet(y = y_endog, x = X, z = Z, type = "GMMz", link = "logit") summary(mod) ## ----fracreghet_gmmxv--------------------------------------------------------- # Endogeneity, GMMxv estimator mod <- fracreghet(y = y_endog, x = X, z = Z, var.endog = var.endog, type = "GMMxv", link = "logit") summary(mod) ## ----fracreghet_qmlxv--------------------------------------------------------- # Endogeneity, QMLxv control function approach mod <- fracreghet(y = y_endog, x = X, z = Z, var.endog = var.endog, type = "QMLxv", link = "logit") summary(mod) ## ----fracreghet-pe------------------------------------------------------------ ### Empirical 401(k) Examples data("fracreg_k401k") y <- fracreg_k401k$prate X_het <- cbind(mrate = fracreg_k401k$mrate, ltotemp = fracreg_k401k$ltotemp) # fracreghet estimators do not allow exact 1s or 0s y_adj <- y y_adj[y_adj == 1] <- 0.999 # Instrument mrate using age Z_emp <- cbind(age = fracreg_k401k$age, ltotemp = fracreg_k401k$ltotemp) res_emp <- fracreghet(y_adj, X_het, Z_emp, var.endog = X_het[, "mrate"], type="QMLxv", link="logit", table=FALSE) pe_res <- fracreghet.pe(res_emp, which.x="mrate") summary(pe_res) ### Simulated Examples N <- 250 u <- rnorm(N) X <- cbind(rnorm(N),rnorm(N)) dimnames(X)[[2]] <- c("X1","X2") Z <- cbind(rnorm(N),rnorm(N),rnorm(N)) dimnames(Z)[[2]] <- c("Z1","Z2","Z3") y <- exp(X[,1]+X[,2]+u)/(1+exp(X[,1]+X[,2]+u)) mod <- fracreghet(y,X,type="GMMx",table=FALSE) #Smearing estimator of average partial effects for variable X1 pe_res <- fracreghet.pe(mod,which.x="X1") summary(pe_res) ## ----fracreghet_pe_cpe-------------------------------------------------------- # Naive estimator of CPE evaluated at fixed values pe_res <- fracreghet.pe(mod,smearing=FALSE,APE=FALSE,CPE=TRUE,at=c(1,-1)) summary(pe_res) ## ----fracreghet-reset--------------------------------------------------------- ### Empirical 401(k) Examples data("fracreg_k401k") y <- fracreg_k401k$prate X_het <- cbind(mrate = fracreg_k401k$mrate, ltotemp = fracreg_k401k$ltotemp) # fracreghet estimators do not allow exact 1s or 0s y_adj <- y y_adj[y_adj == 1] <- 0.999 # Instrument mrate using age Z_emp <- cbind(age = fracreg_k401k$age, ltotemp = fracreg_k401k$ltotemp) res_emp <- fracreghet(y_adj, X_het, type="GMMx", link="logit", table=FALSE) reset_res <- fracreghet.reset(res_emp) summary(reset_res) ### Simulated Examples N <- 250 u <- rnorm(N) X <- cbind(rnorm(N),rnorm(N)) dimnames(X)[[2]] <- c("X1","X2") Z <- cbind(rnorm(N),rnorm(N),rnorm(N)) dimnames(Z)[[2]] <- c("Z1","Z2","Z3") y <- exp(X[,1]+X[,2]+u)/(1+exp(X[,1]+X[,2]+u)) mod <- fracreghet(y,X,type="GMMx",table=FALSE) #LM and Wald versions of the RESET test, based on 1 or 2 fitted powers of xb reset_res <- fracreghet.reset(mod,2:3,c("Wald","LM")) summary(reset_res) ## ----fracregpd---------------------------------------------------------------- ### Empirical 401(k) Examples data("fracreg_k401k") y <- fracreg_k401k$prate X <- cbind(mrate = fracreg_k401k$mrate, age = fracreg_k401k$age, totemp = fracreg_k401k$totemp, sole = fracreg_k401k$sole) # Artificial panel data structure for demonstration N_emp <- nrow(X) id_emp <- rep(1:(N_emp/2), each=2) time_emp <- rep(1:2, times=N_emp/2) mod <- fracregpd(id_emp, time_emp, y, X, type="QMLcre", link="probit") summary(mod) ### Simulated Examples set.seed(123) # Simulating Panel Data N <- 100 T_periods <- 5 id <- rep(1:N, each = T_periods) time <- rep(1:T_periods, times = N) x_panel <- rnorm(N * T_periods) # Unobserved individual effect (CRE) c_i <- rep(rnorm(N), each = T_periods) y_panel <- exp(x_panel + c_i) / (1 + exp(x_panel + c_i)) X <- cbind(x_panel = x_panel) # Endogenous variable and instrument simulation z_panel <- rnorm(N * T_periods) u_panel <- 0.5 * z_panel + rnorm(N * T_periods) var_endog <- 0.8 * z_panel + u_panel y_endog <- exp(x_panel + 1.2 * var_endog + c_i + u_panel) / (1 + exp(x_panel + 1.2 * var_endog + c_i + u_panel)) X_endog <- cbind(x_panel = x_panel, var_endog = var_endog) Z_inst <- cbind(x_panel = x_panel, z_panel = z_panel) # Estimate a Correlated Random Effects (CRE) Model mod <- fracregpd(id=id, time=time, y=y_panel, x=X, type="QMLcre", link="probit") summary(mod) ## ----fracregpd_gmmbgw--------------------------------------------------------- # Exogeneity, GMMbgw estimator mod <- fracregpd(id=id, time=time, y=y_panel, x=X, type="GMMbgw") summary(mod) ## ----fracregpd_gmmww---------------------------------------------------------- # Estimate GMMww estimator with odds ratios mod <- fracregpd(id=id, time=time, y=y_panel, x=X, type="GMMww", or=TRUE, level=0.99) summary(mod) ## ----fracregpd_gmmww_lags----------------------------------------------------- # Lagged covariates and instruments mod <- fracregpd(id=id, time=time, y=y_panel, x=X, lags=TRUE, type="GMMww", var.type="robust") summary(mod) ## ----fracregpd_gmmpfe--------------------------------------------------------- # Endogeneity, time dummies, GMMpfe estimator mod <- fracregpd(id=id, time=time, y=y_endog, x=X_endog, z=Z_inst, x.exogenous=FALSE, type="GMMpfe", tdummies=TRUE) summary(mod) ## ----fracregridge-empirical--------------------------------------------------- data("fracreg_k401k") y_401k <- fracreg_k401k$prate X_401k <- cbind(mrate = fracreg_k401k$mrate, age = fracreg_k401k$age, totemp = fracreg_k401k$totemp, sole = fracreg_k401k$sole) # Fit fractional ridge regression mod_401k <- fracregridge(y = y_401k, x = X_401k, fracs = seq(0.2, 1.0, by = 0.2)) # View full detailed summary showing the chosen alphas summary(mod_401k) # Compute Average Partial Effects for Ridge pe_401k <- fracregridge.pe(mod_401k) summary(pe_401k) ## ----fracregridge-simulated--------------------------------------------------- # Generate random data set.seed(123) n <- 100 p <- 10 y_sim <- rnorm(n) X_sim <- matrix(rnorm(n * p), n, p) colnames(X_sim) <- paste0("X", 1:p) # Fit Fractional Ridge Regression for 30%, 50%, and 80% fractions mod_sim <- fracregridge(y = y_sim, x = X_sim, fracs = c(0.3, 0.5, 0.8)) # View brief summary print(mod_sim) # Compute Partial Effects pe_sim <- fracregridge.pe(mod_sim) summary(pe_sim) ## ----fracregmlogit_example---------------------------------------------------- # Load the empirical spending data data("fracreg_spending") # Define covariates and fractional responses X <- fracreg_spending[, c("houseval", "popdens", "noleft", "minorityleft", "tot")] y <- fracreg_spending[, c("governing", "safety", "education", "recreation", "social", "urbanplanning")] # Fit the Fractional Multinomial Logit model mn_fit <- fracregmlogit(y, X) # View estimates summary(mn_fit) # Compute Average Partial Effects (discrete) mn_pe <- fracregmlogit.pe(mn_fit, effect = "discrete", varlist = c("noleft", "minorityleft")) summary(mn_pe) ## ----fracregmlogit_wtp-------------------------------------------------------- # Calculate Willingness to Pay for the 'noleft' variable using a hypothetical WTP vector # Assuming WTP = 1, 2, 3, 4, 5, 6 for each of the 6 choices wtp_est <- wtp(mn_pe, wtp.vec = 1:6, varlist = "noleft") summary(wtp_est) # Plot the Willingness to Pay effect across observations plot(mn_fit, wtp.vec = 1:6, varlist = "noleft")