Analyze Employment Overlaps Using over_id
Source:R/analyze_employment_transitions.R
analyze_employment_overlaps.RdProvides comprehensive analysis of overlapping employment periods using the over_id functionality from vecshift() output. This function specifically focuses on periods with multiple simultaneous employment contracts (arco > 1) to understand patterns of multiple job holding, employment intensity, and temporal overlap characteristics.
Usage
analyze_employment_overlaps(
segments,
analysis_level = "person",
min_overlap_duration = 1,
include_temporal_patterns = TRUE,
group_by = NULL,
temporal_aggregation = "month",
include_unemployment_context = TRUE
)Arguments
- segments
Input data from vecshift() with over_id column. Must be a data.table with required columns: cf, inizio, fine, arco, durata, over_id, and optionally additional employment attributes for detailed analysis.
- analysis_level
Character string specifying analysis granularity (default: "person"):
"person": Person-level analysis with individual overlap statistics"aggregate": Population-level aggregate overlap patterns"detailed": Both person and aggregate analysis with comprehensive breakdowns
- min_overlap_duration
Minimum duration (days) to consider as meaningful overlap (default: 1). Helps filter out very short-term overlapping contracts.
- include_temporal_patterns
Logical. If TRUE (default), analyzes when overlaps occur most frequently (monthly/seasonal patterns). Requires date columns.
- group_by
Optional character string specifying grouping variable (e.g., "industry", "region") for comparative overlap analysis across different categories. Must be a column name in segments (default: NULL).
- temporal_aggregation
Character string specifying temporal aggregation for pattern analysis when include_temporal_patterns = TRUE (default: "month"):
"month": Monthly overlap frequency patterns"quarter": Quarterly overlap frequency patterns"year": Annual overlap frequency patterns
- include_unemployment_context
Logical. If TRUE (default), includes context about unemployment periods for comparison with overlapping employment patterns.
Value
When analysis_level is "person", returns a list containing:
person_overlaps: data.table with person-level overlap statistics:cf: Person identifiertotal_employment_periods: Total employment segments (arco >= 1)overlapping_episodes: Count of periods with arco > 1single_job_periods: Count of periods with arco = 1overlap_frequency: Proportion of employment periods with overlapsavg_concurrent_jobs: Mean arco for employment periodsmax_concurrent_jobs: Maximum simultaneous jobs (peak employment complexity)total_overlap_days: Sum of days spent in overlapping employmenttotal_employment_days: Sum of all employment daysoverlap_intensity_pct: Percentage of employment time with multiple jobsavg_overlap_duration: Mean duration of overlapping episodesmax_overlap_duration: Longest overlapping episode durationunique_over_id_groups: Count of distinct overlapping employment episodesemployment_complexity_score: Weighted complexity measure
When analysis_level is "aggregate", returns aggregate-level analysis.
When analysis_level is "detailed", returns comprehensive analysis including:
person_overlaps: Person-level statisticsaggregate_overlaps: Population-level aggregate patternsoverlap_duration_distribution: Distribution of overlap durationsemployment_intensity_distribution: Distribution of concurrent job countstemporal_patterns: Temporal overlap frequency (if include_temporal_patterns = TRUE)group_comparisons: Comparative analysis by group (if group_by specified)
All results include attributes:
analysis_parameters: Analysis configuration usedoverlap_validation: Data validation and quality checks specific to overlapscomputation_time: Time taken for analysis
Details
The over_id column from vecshift() identifies continuous overlapping employment periods:
over_id = 0: Unemployment periods (no active contracts)
over_id > 0: Employment periods with same value for overlapping/continuous contracts
Same over_id: All contracts belonging to same continuous overlapping time period
This function analyzes employment overlap patterns including:
Overlap Episodes: Periods where arco > 1 (multiple concurrent jobs)
Employment Intensity: How many jobs are held simultaneously
Duration Patterns: How long overlapping employment lasts
Temporal Analysis: When overlaps occur most frequently
Person-level Patterns: Individual multiple job holding behaviors
Overlap Efficiency: Time spent in multiple vs single employment
Key metrics calculated:
Total overlapping episodes: Count of periods with arco > 1
Average/maximum concurrent jobs: Employment intensity measures
Overlap duration distribution: How long multiple employment lasts
Overlap intensity percentage: Proportion of employment time with multiple jobs
Peak employment complexity: Maximum simultaneous jobs per person
Temporal patterns: Monthly/seasonal overlap frequency (optional)
Examples
if (FALSE) { # \dontrun{
library(data.table)
# Create sample employment data with overlapping periods
employment_data <- data.table(
id = 1:12,
cf = c(rep("PERSON001", 8), rep("PERSON002", 4)),
INIZIO = as.Date(c("2023-01-01", "2023-02-01", "2023-02-15", "2023-05-01",
"2023-05-15", "2023-08-01", "2023-10-01", "2023-11-01",
"2023-01-15", "2023-03-01", "2023-06-01", "2023-09-01")),
FINE = as.Date(c("2023-01-31", "2023-04-30", "2023-04-30", "2023-07-31",
"2023-07-15", "2023-09-30", "2023-10-31", "2023-12-31",
"2023-02-28", "2023-05-31", "2023-08-31", "2023-12-31")),
prior = c(1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1),
company = c("CompanyA", "CompanyB", "CompanyA", "CompanyC", "CompanyD",
"CompanyE", "CompanyF", "CompanyG", "CompanyH", "CompanyI",
"CompanyJ", "CompanyK"),
industry = c("Tech", "Retail", "Tech", "Finance", "Tech", "Retail",
"Finance", "Tech", "Healthcare", "Education", "Finance", "Tech")
)
# Apply vecshift to get segments with over_id
segments <- vecshift(employment_data)
# Comprehensive overlap analysis
overlap_analysis <- analyze_employment_overlaps(
segments = segments,
analysis_level = "detailed",
min_overlap_duration = 1,
include_temporal_patterns = TRUE,
temporal_aggregation = "month"
)
# View person-level overlap patterns
print(overlap_analysis$person_overlaps)
# View aggregate overlap statistics
print(overlap_analysis$aggregate_overlaps)
# View overlap duration distribution
print(overlap_analysis$overlap_duration_distribution)
# View employment intensity patterns
print(overlap_analysis$employment_intensity_distribution)
# View temporal patterns (when overlaps occur)
if (!is.null(overlap_analysis$temporal_patterns)) {
print(overlap_analysis$temporal_patterns)
}
# Person-level analysis only
person_overlaps <- analyze_employment_overlaps(
segments = segments,
analysis_level = "person",
min_overlap_duration = 7, # Focus on overlaps lasting at least a week
include_temporal_patterns = FALSE
)
print(person_overlaps$person_overlaps)
# Aggregate analysis with industry comparison
industry_overlaps <- analyze_employment_overlaps(
segments = segments,
analysis_level = "aggregate",
group_by = "industry",
min_overlap_duration = 1
)
print(industry_overlaps$aggregate_overlaps)
print(industry_overlaps$group_comparisons)
# Quarterly temporal patterns
quarterly_patterns <- analyze_employment_overlaps(
segments = segments,
analysis_level = "detailed",
include_temporal_patterns = TRUE,
temporal_aggregation = "quarter"
)
print(quarterly_patterns$temporal_patterns)
# Check analysis validation and parameters
print(attr(overlap_analysis, "analysis_parameters"))
print(attr(overlap_analysis, "overlap_validation"))
# Example output interpretation:
# - person_overlaps shows which individuals have complex employment patterns
# - overlap_intensity_pct indicates how much time is spent in multiple employment
# - employment_complexity_score provides weighted measure of job juggling behavior
# - temporal_patterns reveal seasonal trends in multiple job holding
# - group_comparisons show industry-specific overlap behaviors
} # }