21  Regional Curve

📐 Theory

Overview

Regional curves are empirical relationships between channel dimensions (bankfull width, depth, and cross-sectional area) and watershed drainage area. These power-law relationships provide a tool for stream assessment and restoration design by characterizing how channel size scales predictably with watershed size within physiographically similar regions.

The FluvialGeomorph toolbox supports regional curve development through:

  • Automated dimension extraction: Extract bankfull dimensions from cross-sections
  • Data management: Organize and quality control regional curve datasets
  • Statistical analysis: Develop regional curve relationships with uncertainty quantification
  • Visualization: Create publication-quality regional curve plots
  • Application: Apply regional curves to assess channel conditions

This chapter describes how to use FluvialGeomorph functions to develop and apply regional curves for stream assessment and restoration design.

Regional Curve Theory

Regional curves are based on hydraulic geometry principles where channel dimensions scale with drainage area according to power-law relationships:

\[W_{bf} = aA^b\]

\[D_{bf} = cA^f\]

\[A_{bf} = kA^m\]

Where:

  • \(W_{bf}\) = bankfull width (m or ft)
  • \(D_{bf}\) = bankfull mean depth (m or ft)
  • \(A_{bf}\) = bankfull cross-sectional area (m² or ft²)
  • \(A\) = drainage area (km² or mi²)
  • \(a\), \(c\), \(k\) = coefficients (intercepts)
  • \(b\), \(f\), \(m\) = exponents (slopes on log-log plot)

FluvialGeomorph uses these relationships to:

  • Compare observed dimensions to regional expectations
  • Estimate appropriate dimensions for restoration design
  • Screen channel conditions across watersheds
  • Validate detailed design calculations

Data Requirements

Input Data Structure

FluvialGeomorph regional curve functions require a data frame with the following fields:

Required Fields:

  • ReachName: Unique site identifier
  • Drainage_Area_km2: Drainage area in square kilometers (or Drainage_Area_mi2)
  • bankfull_width_m: Bankfull width in meters (or _ft)
  • bankfull_depth_m: Bankfull mean depth in meters (or _ft)
  • bankfull_area_m2: Bankfull cross-sectional area in square meters (or _ft2)

Optional Fields:

  • Region: Regional grouping for stratified analysis
  • ChannelType: Channel classification
  • DataSource: Field, LiDAR, or combined
  • QualityRating: Data quality indicator

Sample Size Guidelines

Minimum Requirements:

  • 20-30 sites for basic regional curves
  • 50-100 sites for robust relationships
  • 100+ sites for comprehensive regional coverage
  • 5-10 sites per order of magnitude of drainage area

Drainage Area Range:

  • Span 2-3 orders of magnitude minimum
  • Adequate coverage across range (avoid gaps)
  • Sufficient sites at small and large end of range

FluvialGeomorph Workflow

Step 1: Extract Dimensions from Cross-Sections

Use FluvialGeomorph cross-section analysis functions to extract bankfull dimensions:

library(fluvialgeomorph)

# Calculate bankfull dimensions for each cross-section
xs_dimensions <- xs_dimensions(xs, 
                                bankfull_elevation = bf_elevation,
                                reach_name = "Site_01")

# Aggregate to reach-scale means
reach_dims <- xs_reach_dimensions(xs_dimensions)

The xs_dimensions function calculates:

  • Bankfull width
  • Bankfull mean depth
  • Bankfull cross-sectional area
  • Width-depth ratio
  • Other hydraulic geometry parameters

Step 2: Compile Regional Dataset

Combine reach-scale dimensions from multiple sites into a regional curve dataset:

# Create regional curve dataset
rc_data <- data.frame(
  ReachName = reach_names,
  Drainage_Area_km2 = drainage_areas,
  bankfull_width_m = bf_widths,
  bankfull_depth_m = bf_depths,
  bankfull_area_m2 = bf_areas,
  DataSource = data_sources
)

# View dataset structure
str(rc_data)
head(rc_data)

Step 3: Quality Control and Screening

Apply quality control procedures to the regional dataset:

# Summary statistics
summary(rc_data)

# Check for missing values
sum(is.na(rc_data))

# Identify potential outliers (>3 standard deviations)
rc_data$width_zscore <- scale(log10(rc_data$bankfull_width_m))
outliers <- rc_data[abs(rc_data$width_zscore) > 3, ]

# Remove outliers if justified
rc_data_clean <- rc_data[abs(rc_data$width_zscore) <= 3, ]

Step 4: Develop Regional Curves

Use FluvialGeomorph functions to develop regional curve relationships:

# Develop width regional curve
width_curve <- regional_curve(data = rc_data_clean,
                              dimension = "bankfull_width_m",
                              drainage_area = "Drainage_Area_km2",
                              method = "ols")

# View curve parameters
summary(width_curve)

# Extract coefficients and exponents
coef(width_curve)

# Develop curves for all dimensions
depth_curve <- regional_curve(rc_data_clean, "bankfull_depth_m", 
                             "Drainage_Area_km2")
area_curve <- regional_curve(rc_data_clean, "bankfull_area_m2",
                            "Drainage_Area_km2")

The regional_curve function:

  • Log-transforms data
  • Performs regression analysis
  • Calculates goodness-of-fit statistics (R², SEE)
  • Computes confidence and prediction intervals
  • Returns model object for further analysis

Step 5: Evaluate Model Fit

Assess regional curve quality using diagnostic functions:

# Goodness of fit statistics
rc_stats <- regional_curve_stats(width_curve)
print(rc_stats)

# Residual analysis
rc_residuals <- regional_curve_residuals(width_curve)
plot(rc_residuals)

# Check regression assumptions
par(mfrow = c(2, 2))
plot(width_curve$model)

Key statistics to evaluate:

  • : Proportion of variance explained (0.7-0.95 typical)
  • SEE: Standard error of estimate in log space
  • RMSE: Root mean square error in original units
  • Residual patterns: Check for systematic bias

Step 6: Visualize Regional Curves

Create publication-quality regional curve plots:

# Basic regional curve plot
plot_regional_curve(width_curve, 
                   title = "Bankfull Width Regional Curve",
                   xlab = "Drainage Area (km²)",
                   ylab = "Bankfull Width (m)")

# Add prediction intervals
plot_regional_curve(width_curve, 
                   prediction_interval = TRUE,
                   confidence_interval = TRUE,
                   pi_level = 0.95)

# Customize plot appearance
plot_regional_curve(width_curve,
                   point_color = "blue",
                   line_color = "red",
                   show_equation = TRUE,
                   show_stats = TRUE)

# Multi-panel plot for all dimensions
par(mfrow = c(1, 3))
plot_regional_curve(width_curve, main = "Width")
plot_regional_curve(depth_curve, main = "Depth")
plot_regional_curve(area_curve, main = "Area")

Step 7: Apply Regional Curves

Use developed curves to predict dimensions at new sites:

# Predict dimensions for new drainage areas
new_sites <- data.frame(
  ReachName = c("New_Site_1", "New_Site_2"),
  Drainage_Area_km2 = c(15.5, 42.3)
)

# Apply regional curves
predictions <- predict_regional_curve(width_curve, 
                                     newdata = new_sites,
                                     interval = "prediction",
                                     level = 0.95)

# View predictions with intervals
print(predictions)

# Compare observed vs. predicted dimensions
rc_data_clean$predicted_width <- predict(width_curve, 
                                        newdata = rc_data_clean)
rc_data_clean$residual <- rc_data_clean$bankfull_width_m - 
                          rc_data_clean$predicted_width

# Calculate percent difference
rc_data_clean$percent_diff <- 100 * rc_data_clean$residual / 
                              rc_data_clean$predicted_width

Step 8: Export Results

Export regional curve parameters and predictions:

# Export curve coefficients
curve_params <- data.frame(
  Dimension = c("Width", "Depth", "Area"),
  Coefficient = c(coef(width_curve)[1], 
                 coef(depth_curve)[1],
                 coef(area_curve)[1]),
  Exponent = c(coef(width_curve)[2],
              coef(depth_curve)[2], 
              coef(area_curve)[2]),
  R_squared = c(summary(width_curve)$r.squared,
               summary(depth_curve)$r.squared,
               summary(area_curve)$r.squared),
  SEE = c(summary(width_curve)$sigma,
         summary(depth_curve)$sigma,
         summary(area_curve)$sigma)
)

write.csv(curve_params, "regional_curve_parameters.csv", 
         row.names = FALSE)

# Export predictions
write.csv(predictions, "regional_curve_predictions.csv",
         row.names = FALSE)

# Export dataset with predictions
write.csv(rc_data_clean, "regional_curve_dataset.csv",
         row.names = FALSE)

Advanced Applications

Stratified Regional Curves

Develop separate curves for different regions or channel types:

# Stratify by region
regions <- unique(rc_data_clean$Region)

# Develop curves for each region
region_curves <- lapply(regions, function(r) {
  subset_data <- rc_data_clean[rc_data_clean$Region == r, ]
  regional_curve(subset_data, "bankfull_width_m", "Drainage_Area_km2")
})

names(region_curves) <- regions

# Compare regional curves
plot_regional_curves_comparison(region_curves, 
                               legend_labels = regions)

Validation Analysis

Validate regional curves using independent datasets:

# Split data into calibration and validation sets
set.seed(123)
train_idx <- sample(1:nrow(rc_data_clean), 
                   size = 0.7 * nrow(rc_data_clean))
train_data <- rc_data_clean[train_idx, ]
valid_data <- rc_data_clean[-train_idx, ]

# Develop curve on training data
train_curve <- regional_curve(train_data, "bankfull_width_m",
                             "Drainage_Area_km2")

# Validate on independent data
valid_pred <- predict(train_curve, newdata = valid_data)
valid_data$predicted <- valid_pred

# Calculate validation statistics
validation_stats <- data.frame(
  RMSE = sqrt(mean((valid_data$bankfull_width_m - valid_pred)^2)),
  MAE = mean(abs(valid_data$bankfull_width_m - valid_pred)),
  R_squared = cor(valid_data$bankfull_width_m, valid_pred)^2
)

print(validation_stats)

Comparison with Existing Curves

Compare FluvialGeomorph-derived curves with published regional curves:

# Define published curve parameters
published_curve <- list(
  coefficient = 4.23,
  exponent = 0.48,
  source = "Harman et al. 1999"
)

# Apply published curve to dataset
rc_data_clean$published_pred <- published_curve$coefficient * 
                                rc_data_clean$Drainage_Area_km2^published_curve$exponent

# Compare predictions
comparison_plot <- ggplot(rc_data_clean, 
                         aes(x = bankfull_width_m)) +
  geom_point(aes(y = predicted_width, color = "FluvialGeomorph")) +
  geom_point(aes(y = published_pred, color = "Published")) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed") +
  labs(x = "Observed Width (m)", 
       y = "Predicted Width (m)",
       color = "Curve Source") +
  theme_minimal()

print(comparison_plot)

Uncertainty Analysis

Quantify and visualize prediction uncertainty:

# Calculate prediction intervals
pred_intervals <- predict(width_curve, 
                         newdata = rc_data_clean,
                         interval = "prediction",
                         level = 0.95)

rc_data_clean$pred_lower <- pred_intervals[, "lwr"]
rc_data_clean$pred_upper <- pred_intervals[, "upr"]

# Identify sites outside prediction interval
rc_data_clean$outside_PI <- rc_data_clean$bankfull_width_m < rc_data_clean$pred_lower |
                            rc_data_clean$bankfull_width_m > rc_data_clean$pred_upper

# Summarize sites outside prediction interval
outside_sites <- rc_data_clean[rc_data_clean$outside_PI, ]
print(paste(nrow(outside_sites), "sites outside 95% prediction interval"))

# Plot with uncertainty bands
plot_regional_curve_uncertainty(width_curve,
                               data = rc_data_clean,
                               highlight_outliers = TRUE)

Regional Curve Reports

Generate comprehensive regional curve reports:

# Create regional curve report
regional_curve_report(
  curves = list(width = width_curve, 
               depth = depth_curve,
               area = area_curve),
  data = rc_data_clean,
  output_file = "regional_curve_report.html",
  title = "Piedmont Regional Curves",
  author = "Your Name",
  date = Sys.Date(),
  include_diagnostics = TRUE,
  include_validation = TRUE
)

The report includes:

  • Curve equations and parameters
  • Goodness-of-fit statistics
  • Diagnostic plots
  • Data summary tables
  • Validation results
  • Application guidance

Best Practices

Data Quality

Site Selection:

  • Use stable, reference-quality streams
  • Avoid recently disturbed or modified channels
  • Ensure clear bankfull indicators
  • Stratify by drainage area
  • Maintain geographic distribution

Dimension Extraction:

  • Use consistent bankfull identification methods
  • Extract dimensions from multiple cross-sections per reach
  • Calculate reach-scale means
  • Document quality ratings
  • Remove poor-quality sites

Statistical Analysis

Regression Methods:

  • Use log-transformation for power-law relationships
  • Check regression assumptions (linearity, homoscedasticity, normality)
  • Analyze residuals for patterns
  • Remove outliers only if justified
  • Document all decisions

Model Evaluation:

  • Calculate goodness-of-fit statistics (R², SEE, RMSE)
  • Perform residual analysis
  • Validate with independent data
  • Compare with existing curves
  • Quantify uncertainty

Application Guidelines

Appropriate Uses:

  • Preliminary assessment of channel condition
  • Screening-level analysis across watersheds
  • Initial dimensioning for restoration design
  • Validation of detailed design calculations
  • Comparison with field measurements

Limitations:

  • Curves represent average conditions for stable streams
  • Prediction intervals are wide (±30-40% typical)
  • Should be verified with field observations
  • Not applicable to highly modified channels
  • Extrapolation beyond data range uncertain

Example: Complete Workflow

# Load FluvialGeomorph
library(fluvialgeomorph)

# 1. Load regional dataset
rc_data <- read.csv("regional_curve_data.csv")

# 2. Quality control
rc_data_clean <- rc_data[complete.cases(rc_data), ]
rc_data_clean <- rc_data_clean[rc_data_clean$QualityRating >= 3, ]

# 3. Develop regional curves
width_curve <- regional_curve(rc_data_clean, 
                             "bankfull_width_m",
                             "Drainage_Area_km2")
depth_curve <- regional_curve(rc_data_clean,
                             "bankfull_depth_m", 
                             "Drainage_Area_km2")
area_curve <- regional_curve(rc_data_clean,
                            "bankfull_area_m2",
                            "Drainage_Area_km2")

# 4. Evaluate models
summary(width_curve)
plot(width_curve$model)

# 5. Visualize curves
par(mfrow = c(1, 3))
plot_regional_curve(width_curve, main = "Bankfull Width")
plot_regional_curve(depth_curve, main = "Bankfull Depth")
plot_regional_curve(area_curve, main = "Bankfull Area")

# 6. Apply to new sites
new_sites <- data.frame(Drainage_Area_km2 = c(10, 25, 50, 100))
predictions <- predict_regional_curve(width_curve, 
                                     newdata = new_sites,
                                     interval = "prediction")

# 7. Export results
write.csv(predictions, "predictions.csv", row.names = FALSE)

# 8. Generate report
regional_curve_report(
  curves = list(width = width_curve, 
               depth = depth_curve, 
               area = area_curve),
  data = rc_data_clean,
  output_file = "regional_curve_report.html"
)

Summary

FluvialGeomorph provides a comprehensive toolkit for regional curve development and application:

  • Automated extraction of bankfull dimensions from cross-sections
  • Data management functions for organizing regional datasets
  • Statistical analysis tools for developing robust relationships
  • Visualization functions for publication-quality plots
  • Application tools for predicting dimensions and assessing conditions
  • Reporting capabilities for documenting results

Regional curves developed with FluvialGeomorph support stream assessment and restoration design by providing empirical relationships between channel dimensions and drainage area, enabling rapid screening of channel conditions and preliminary design guidance across watersheds and regions. ```