Share of total revenue originating from government grants.
Formula:
ggr = government_grants / total_revenueDefinitional Range
Bounded [0, 1]. Zero means no government funding; one means all revenue comes from government sources. The empirical distribution varies widely by subsector: social service organizations often show ratios above 0.50; arts organizations typically below 0.20.
Benchmarks and rules of thumb
Values above 0.50 indicate majority government-funded organizations, which face heightened vulnerability to government budget changes.
Revenue diversification theory suggests maintaining no single source above 0.33-0.50 for optimal stability (Chang & Tuckman 1994).
Calculated For: 990 filers only.
Usage
get_grants_govt_ratio( df,
government_grants = "F9_08_REV_CONTR_GOVT_GRANT",
total_revenue = "F9_08_REV_TOT_TOT",
winsorize = 0.98 ,
range = "zo",
sanitize = TRUE,
summarize = FALSE )Arguments
- df
A
data.framecontaining the fields required for computing the metric.- government_grants
Government grants and contributions.
- total_revenue
Total revenue.
- winsorize
The winsorization value (between 0 and 1), defaults to 0.98, which winsorizes at the 1st and 99th percentiles.
- range
Character string specifying the theoretical range of the ratio, used to set winsorization bounds. Default
"zo". Options:"np"(negative to positive),"zp"(zero to positive),"zo"(zero to one),"nz"(negative to zero), or a custom"lo;hi"pair (e.g."0;10").- sanitize
Logical (default
TRUE). IfTRUE, NA values in the financial input columns are imputed to zero before the ratio is computed, respecting form scope: Part X and VIII/IX fields (990 only) are imputed only for 990 filers; Part I summary fields (990 + 990EZ) are imputed for all filers. The returned dataframe always contains the original unmodified input columns.- summarize
Logical. If
TRUE, prints asummary()of the results and plots density curves for all four output columns (raw, winsorized, z-score, percentile). Defaults toFALSE.
Value
Object of class data.frame: the original dataframe appended with four
new columns:
- `grants_govt` - government grant ratio (raw)
- `grants_govt_w` - winsorized version
- `grants_govt_z` - standardized z-score (based on winsorized values)
- `grants_govt_p` - percentile rank (1-100)Details
Primary uses and key insights
The government grant ratio measures what fraction of total revenue comes from government grants and contributions. It is a revenue diversification indicator specifically focused on public sector dependency. High ratios indicate heavy reliance on government funding, which creates exposure to policy changes, budget cycles, and political priorities that can suddenly alter the funding environment.
Government funding also typically comes with extensive compliance, reporting, and audit requirements that increase administrative costs, making the government grant ratio a useful input to overhead analysis. This ratio is a core component of revenue concentration and diversification studies in the nonprofit literature.
Formula variations and their sources
Government grants (Part VIII line 1e) / total revenue (Part VIII line 12A). Some studies also include government contracts reported as program service revenue (Part VIII line 2), which would capture government fees-for-service alongside grants, but these cannot be separated from private program revenue on the 990.
Canonical citations
Chang, C.F. & Tuckman, H.P. (1994). Revenue diversification among nonprofits. VOLUNTAS, 5(3), 273-290. - Foundational paper on revenue concentration risk.
Carroll, D.A. & Stater, K.J. (2009). Revenue diversification in nonprofit organizations: Does it lead to financial stability? Journal of Public Administration Research and Theory, 19(4), 947-966.
Froelich, K.A. (1999). Diversification of revenue strategies: Evolving resource dependence in nonprofit organizations. Nonprofit and Voluntary Sector Quarterly, 28(3), 246-268.
Examples
library( fiscal )
data( dat10k )
d <- get_grants_govt_ratio( df = dat10k )
#> :: Total revenue equal to zero :: 74 case(s) replaced with NaN
head( d[ , c( "grants_govt", "grants_govt_w", "grants_govt_z", "grants_govt_p" ) ] )
#> grants_govt grants_govt_w grants_govt_z grants_govt_p
#> <num> <num> <num> <int>
#> 1: NA NA NA NA
#> 2: 0 0 -3.579527 1
#> 3: 0 0 -3.579527 1
#> 4: NA NA NA NA
#> 5: 0 0 -3.579527 1
#> 6: NA NA NA NA