From 2007d6ab4449a5a4345687e6744bd708516f8843 Mon Sep 17 00:00:00 2001 From: Matthieu Gomez Date: Fri, 28 Aug 2026 17:53:08 -0400 Subject: [PATCH 1/8] Reduce latency with vector-based formula machinery - Add utils/vectorterms.jl: replicas of the StatsModels schema/modelcols/coefnames pipeline operating on Vector{AbstractTerm} and runtime column lookup, so methods compile per term type rather than per formula shape or column names - Rewire fit to the vector path (parsing, schema, model matrices, coefnames) - Add @nospecialize to reg and to the FixedEffectModel constructor formula arguments - Cover categorical and interaction term types in the precompile workload - Test that reg never modifies the input dataframe - Bump version to 2.1.0 --- Project.toml | 2 +- src/FixedEffectModel.jl | 12 +++ src/FixedEffectModels.jl | 6 +- src/fit.jl | 111 +++++++++++++------------ src/utils/vectorterms.jl | 169 +++++++++++++++++++++++++++++++++++++++ test/fit.jl | 29 ++++++- 6 files changed, 277 insertions(+), 52 deletions(-) create mode 100644 src/utils/vectorterms.jl diff --git a/Project.toml b/Project.toml index 3f2ea62c..e4f039a1 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "FixedEffectModels" uuid = "9d5cd8c9-2029-5cab-9928-427838db53e3" -version = "2.0.0" +version = "2.1.0" [deps] DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" diff --git a/src/FixedEffectModel.jl b/src/FixedEffectModel.jl index ee125f13..e48d4df3 100644 --- a/src/FixedEffectModel.jl +++ b/src/FixedEffectModel.jl @@ -51,6 +51,18 @@ struct FixedEffectModel <: RegressionModel # for IV F_kp::Float64 # First Stage F statistics KP p_kp::Float64 # First Stage p value KP + + # @nospecialize on the formula arguments: their concrete types change with + # every formula shape, and the fields are abstract anyway, so specializing + # the constructor would recompile it on each new formula + function FixedEffectModel(coef, vcov, vcov_type, nclusters, esample, residuals, fe, fekeys, + coefnames, responsename, @nospecialize(formula), @nospecialize(formula_schema), + contrasts, nobs, dof, dof_fes, dof_residual, rss, tss, F, p, + iterations, converged, r2_within, F_kp, p_kp) + return new(coef, vcov, vcov_type, nclusters, esample, residuals, fe, fekeys, + coefnames, responsename, formula, formula_schema, contrasts, nobs, dof, + dof_fes, dof_residual, rss, tss, F, p, iterations, converged, r2_within, F_kp, p_kp) + end end """ diff --git a/src/FixedEffectModels.jl b/src/FixedEffectModels.jl index 6e387a59..9a7aa89b 100644 --- a/src/FixedEffectModels.jl +++ b/src/FixedEffectModels.jl @@ -20,6 +20,7 @@ include("utils/fixedeffects.jl") include("utils/basecol.jl") include("utils/tss.jl") include("utils/formula.jl") +include("utils/vectorterms.jl") include("FixedEffectModel.jl") include("fit.jl") include("partial_out.jl") @@ -39,10 +40,13 @@ Vcov @compile_workload begin - df = DataFrame(x1 = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], x2 = [1.0, 2.0, 4.0, 4.0, 3.0, 5.0], y = [3.0, 4.0, 4.0, 5.0, 1.0, 2.0], id = [1, 1, 2, 2, 3, 3]) + df = DataFrame(x1 = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], x2 = [1.0, 2.0, 4.0, 4.0, 3.0, 5.0], y = [3.0, 4.0, 4.0, 5.0, 1.0, 2.0], id = [1, 1, 2, 2, 3, 3], s = ["a", "a", "b", "b", "a", "b"]) reg(df, @formula(y ~ x1 + x2)) reg(df, @formula(y ~ x1 + fe(id))) reg(df, @formula(y ~ x1), Vcov.cluster(:id)) + # cover the categorical and interaction term types (the vector-based + # machinery compiles per term type, not per formula shape) + reg(df, @formula(y ~ x1 + s + x1&x2 + x1&s)) end diff --git a/src/fit.jl b/src/fit.jl index 1a7e0cd5..2d097e1b 100644 --- a/src/fit.jl +++ b/src/fit.jl @@ -49,21 +49,21 @@ df = dataset("plm", "Cigar") fit(FixedEffectModel, @formula(Sales ~ NDI + fe(State) + fe(State)&Year), df) ``` """ -function reg(df, - formula::FormulaTerm, - vcov::CovarianceEstimator = Vcov.simple(); - contrasts::Dict = Dict{Symbol, Any}(), - weights::Union{Symbol, Nothing} = nothing, - save::Union{Bool, Symbol} = :none, - method::Symbol = :cpu, - nthreads::Union{Integer, Nothing} = nothing, - double_precision::Bool = method == :cpu, - tol::Real = 1e-6, - maxiter::Integer = 10000, - drop_singletons::Bool = true, - progress_bar::Bool = true, - subset::Union{Nothing, AbstractVector} = nothing, - first_stage::Bool = true) +function reg(@nospecialize(df), + @nospecialize(formula::FormulaTerm), + @nospecialize(vcov::CovarianceEstimator = Vcov.simple()); + @nospecialize(contrasts::Dict = Dict{Symbol, Any}()), + @nospecialize(weights::Union{Symbol, Nothing} = nothing), + @nospecialize(save::Union{Bool, Symbol} = :none), + @nospecialize(method::Symbol = :cpu), + @nospecialize(nthreads::Union{Integer, Nothing} = nothing), + @nospecialize(double_precision::Bool = method == :cpu), + @nospecialize(tol::Real = 1e-6), + @nospecialize(maxiter::Integer = 10000), + @nospecialize(drop_singletons::Bool = true), + @nospecialize(progress_bar::Bool = true), + @nospecialize(subset::Union{Nothing, AbstractVector} = nothing), + @nospecialize(first_stage::Bool = true)) StatsAPI.fit(FixedEffectModel, formula, df, vcov; contrasts = contrasts, weights = weights, save = save, method = method, nthreads = nthreads, double_precision = double_precision, tol = tol, maxiter = maxiter, drop_singletons = drop_singletons, progress_bar = progress_bar, subset = subset, first_stage = first_stage) end @@ -113,13 +113,19 @@ function StatsAPI.fit(::Type{FixedEffectModel}, ========================================================# formula_origin = formula - if !omitsintercept(formula) && !hasintercept(formula) - formula = FormulaTerm(formula.lhs, InterceptTerm{true}() + formula.rhs) + formula.lhs isa FormulaTerm && throw(ArgumentError("Malformed formula: the left-hand side cannot contain `~`. The instrumental-variable syntax is `y ~ exogenous + (endogenous ~ instruments)`.")) + # Work on Vector{AbstractTerm} rather than the formula's term tuple: the + # vector-based machinery in utils/vectorterms.jl compiles per term type + # rather than per formula shape, which avoids recompilation on every new + # formula (see that file for details). + exo_ts = termvector(formula.rhs) + if !_omitsintercept(exo_ts) && !_hasintercept(exo_ts) + pushfirst!(exo_ts, InterceptTerm{true}()) end - formula, formula_endo, formula_iv = parse_iv(formula) - has_iv = formula_iv != FormulaTerm(ConstantTerm(0), ConstantTerm(0)) - formula, formula_fes = parse_fe(formula) - has_fes = formula_fes != FormulaTerm(ConstantTerm(0), ConstantTerm(0)) + endo_ts, iv_ts = parse_iv!(exo_ts) + has_iv = !isempty(endo_ts) + fe_ts = parse_fe!(exo_ts) + has_fes = !isempty(fe_ts) # HC2/HC3 compute leverage from the partialled-out (demeaned) regressors only, which # omits the absorbed fixed-effect contribution to leverage. The resulting standard # errors are silently anti-conservative, so guard against the combination (mirroring @@ -132,25 +138,28 @@ function StatsAPI.fit(::Type{FixedEffectModel}, has_weights = weights !== nothing # Avoid FE parser on no-FE regressions; it touches table/formula dispatch. - fes, feids, fekeys = has_fes ? parse_fixedeffect(df, formula_fes) : (FixedEffect[], Symbol[], Symbol[]) + fes, feids, fekeys = has_fes ? parse_fixedeffect(df, fe_ts) : (FixedEffect[], Symbol[], Symbol[]) has_fe_intercept = any(fe.interaction isa UnitWeights for fe in fes) # remove intercept if absorbed by fixed effects if has_fe_intercept - formula = FormulaTerm(formula.lhs, tuple(InterceptTerm{false}(), (term for term in eachterm(formula.rhs) if !isa(term, Union{ConstantTerm,InterceptTerm}))...)) + filter!(t -> !isa(t, Union{ConstantTerm, InterceptTerm}), exo_ts) + pushfirst!(exo_ts, InterceptTerm{false}()) end - has_intercept = hasintercept(formula) + has_intercept = _hasintercept(exo_ts) #======================================================== Create boolean vector esample that is true for observations used in estimation ========================================================# # Collect all variable names needed to detect missing values and build model matrices - exo_vars = unique(StatsModels.termvars(formula)) - iv_vars = unique(StatsModels.termvars(formula_iv)) - endo_vars = unique(StatsModels.termvars(formula_endo)) - fe_vars = unique(StatsModels.termvars(formula_fes)) - all_vars = unique(vcat(exo_vars, endo_vars, iv_vars, fe_vars)) + response_vars = StatsModels.termvars(formula.lhs) + exo_vars = termvars_vector(exo_ts) + endo_vars = termvars_vector(endo_ts) + iv_vars = termvars_vector(iv_ts) + fe_vars = termvars_vector(fe_ts) + model_vars = unique(vcat(response_vars, exo_vars, endo_vars, iv_vars)) + all_vars = unique(vcat(model_vars, fe_vars)) # Create esample that returns obs used in estimation esample = completecases(df, all_vars) @@ -181,7 +190,9 @@ function StatsAPI.fit(::Type{FixedEffectModel}, else weights = uweights(nobs) end - subdf = DataFrame((; (x => disallowmissing(view(df[!, x], esample)) for x in all_vars)...)) + # constructed from a vector of pairs, not a NamedTuple splat: column names + # stay out of the type domain, so nothing recompiles on new variable names + subdf = DataFrame(Pair{Symbol, AbstractVector}[x => disallowmissing(view(df[!, x], esample)) for x in all_vars], copycols = false) subfes = FixedEffect[fe[esample] for fe in fes] vcov_method = Vcov.materialize(view(df, esample, :), vcov) @@ -189,33 +200,35 @@ function StatsAPI.fit(::Type{FixedEffectModel}, Dataframe --> Matrix ========================================================# - s = schema(formula, subdf, contrasts) - - formula_schema = apply_schema(formula, s, FixedEffectModel, has_fe_intercept) + sch = build_schema(model_vars, subdf, contrasts) - # for a Vector{Float64}, convert(Vector{Float64}, y) aliases y - y = convert(Vector{Float64}, response(formula_schema, subdf)) - Xexo = convert(Matrix{Float64}, modelmatrix(formula_schema, subdf)) - response_name, coefnames_exo = coefnames(formula_schema) + exo_ts = apply_schema_vector(exo_ts, sch, StatisticalModel, has_fe_intercept) + lhs_schema = apply_schema(formula.lhs, sch, StatisticalModel) + # the constructor always copies, so y never aliases a column of df + y = Vector{Float64}(modelcols_term(lhs_schema, subdf, nobs)) + Xexo = modelmatrix_vector(exo_ts, subdf, nobs) + response_name = coefnames(lhs_schema) + coefnames_exo = coefnames_vector(exo_ts) Xendo = Array{Float64}(undef, nobs, 0) Z = Array{Float64}(undef, nobs, 0) - coefnames_endo = typeof(coefnames_exo)[] - coefnames_iv = typeof(coefnames_exo)[] + coefnames_endo = String[] + coefnames_iv = String[] if has_iv - formula_endo_schema = apply_schema(formula_endo, schema(formula_endo, subdf, contrasts), StatisticalModel) - Xendo = convert(Matrix{Float64}, modelmatrix(formula_endo_schema, subdf)) - _, coefnames_endo = coefnames(formula_endo_schema) - - formula_iv_schema = apply_schema(formula_iv, schema(formula_iv, subdf, contrasts), StatisticalModel) - _, coefnames_iv = coefnames(formula_iv_schema) - - Z = convert(Matrix{Float64}, modelmatrix(formula_iv_schema, subdf)) + endo_ts = apply_schema_vector(endo_ts, sch, StatisticalModel) + Xendo = modelmatrix_vector(endo_ts, subdf, nobs) + coefnames_endo = coefnames_vector(endo_ts) - # modify formula to use in predict - formula_schema = FormulaTerm(formula_schema.lhs, MatrixTerm(tuple(eachterm(formula_schema.rhs)..., (term for term in eachterm(formula_endo_schema.rhs) if term != ConstantTerm(0))...))) + iv_ts = apply_schema_vector(iv_ts, sch, StatisticalModel) + Z = modelmatrix_vector(iv_ts, subdf, nobs) + coefnames_iv = coefnames_vector(iv_ts) end coef_names = vcat(coefnames_exo, coefnames_endo) + + # formula with concrete terms, stored in the model and used by predict; + # with IV, the endogenous terms are appended since their coefficients are reported + predict_ts = has_iv ? vcat(exo_ts, AbstractTerm[t for t in endo_ts if StatsModels.width(t) > 0]) : exo_ts + formula_schema = FormulaTerm(lhs_schema, MatrixTerm((predict_ts...,))) # compute tss now before potentially demeaning y tss_total = tss(y, has_intercept || has_fe_intercept, weights) diff --git a/src/utils/vectorterms.jl b/src/utils/vectorterms.jl new file mode 100644 index 00000000..d2a541ef --- /dev/null +++ b/src/utils/vectorterms.jl @@ -0,0 +1,169 @@ +#======================================================== +Vector-based replicas of the StatsModels formula machinery, for latency. + +StatsModels represents a formula right-hand side as a *tuple* of terms and the +data as a NamedTuple keyed by *column names*. Both encode information in the +type domain, so every new formula shape (number of terms) and every new set of +column names compiles fresh specializations of schema/apply_schema/modelcols — +roughly 0.2-0.3s of compilation per regression with a formula never seen +before, even when every individual term type has been precompiled. + +The functions here operate on Vector{AbstractTerm} and look up columns by +runtime Symbol. Dispatch happens once per term *type* (ContinuousTerm, +CategoricalTerm, InteractionTerm, ...), so after the precompile workload a +regression with a brand-new formula runs entirely warm. The semantics +replicate the StatsModels tuple path exactly; in particular the stateful +FullRank contrast promotion is sequential over terms, so applying it in a +vector loop is equivalent to applying it to a tuple. +========================================================# + +# FormulaTerm rhs (tuple of terms or a single term) -> Vector{AbstractTerm} +function termvector(@nospecialize(x)) + ts = AbstractTerm[] + if x isa Tuple + for t in x + push!(ts, t) + end + else + push!(ts, x) + end + return ts +end + +# same definitions as StatsModels.hasintercept/omitsintercept, on a term vector +_hasintercept(ts::Vector{AbstractTerm}) = + any(t -> t == InterceptTerm{true}() || t == ConstantTerm(1), ts) +_omitsintercept(ts::Vector{AbstractTerm}) = + any(t -> t == InterceptTerm{false}() || t == ConstantTerm(0) || t == ConstantTerm(-1), ts) + +function termvars_vector(ts::Vector{AbstractTerm}) + out = Symbol[] + for t in ts + append!(out, StatsModels.termvars(t)) + end + return unique!(out) +end + +# Split the first (endogenous ~ instruments) term out of rhs (mutating it into +# the exogenous part). Returns endo and iv term vectors, empty when there is no +# IV term. Variables appearing on both sides are treated as exogenous controls. +function parse_iv!(rhs::Vector{AbstractTerm}) + i = findfirst(t -> t isa FormulaTerm, rhs) + i === nothing && return AbstractTerm[], AbstractTerm[] + ivpart = rhs[i]::FormulaTerm + endo_all = termvector(ivpart.lhs) + iv_all = termvector(ivpart.rhs) + both = intersect(endo_all, iv_all) + endos = setdiff(endo_all, both) + exos = setdiff(iv_all, both) + isempty(endos) && throw(ArgumentError("There are no endogeneous variables")) + length(exos) < length(endos) && throw(ArgumentError("Model not identified. There must be at least as many instrumental variables as endogeneneous variables")) + filter!(t -> !isa(t, FormulaTerm), rhs) + append!(rhs, both) + # the leading ConstantTerm(0) suppresses the intercept when the schema is + # applied, so categorical endogenous variables get full dummy coding + return pushfirst!(endos, ConstantTerm(0)), pushfirst!(exos, ConstantTerm(0)) +end + +# Split fixed-effect terms out of rhs (mutating it). A main-effect term exactly +# spanned by a continuous-slope fixed effect is removed as well (see parse_fe). +function parse_fe!(rhs::Vector{AbstractTerm}) + fe_ts = AbstractTerm[t for t in rhs if has_fe(t)] + isempty(fe_ts) && return fe_ts + filter!(t -> !has_fe(t) && !any(fe_t -> _is_absorbed_fe_slope(t, fe_t), fe_ts), rhs) + return fe_ts +end + +function parse_fixedeffect(data, ts::Vector{AbstractTerm}) + fes = FixedEffect[] + feids = Symbol[] + fekeys = Symbol[] + for t in ts + result = _parse_fixedeffect(data, t) + if result !== nothing + push!(fes, result[1]) + push!(feids, result[2]) + append!(fekeys, result[3]) + end + end + return fes, feids, unique(fekeys) +end + +getcol(data, s::Symbol) = Tables.getcolumn(data, s) + +# name-free equivalent of schema(f, data, contrasts): one concrete term per +# variable, computed from the column looked up by runtime symbol +function build_schema(vars::Vector{Symbol}, data, contrasts::Dict) + sch = StatsModels.Schema() + for s in vars + t = Term(s) + sch.schema[t] = StatsModels.concrete_term(t, getcol(data, s), get(contrasts, s, nothing)) + end + return sch +end + +# equivalent of apply_schema(ts, FullRank(sch), Mod) on a tuple: FullRank +# promotion mutates its `already` set term by term, left to right +function apply_schema_vector(ts::Vector{AbstractTerm}, sch::StatsModels.Schema, Mod::Type, + already_intercept::Bool = false) + fullrank = StatsModels.FullRank(sch) + already_intercept && push!(fullrank.already, InterceptTerm{true}()) + out = AbstractTerm[] + for t in ts + applied = apply_schema(t, fullrank, Mod) + if applied isa Tuple + for a in applied + push!(out, a) + end + else + push!(out, applied) + end + end + return out +end + +# per-term model columns; block eltypes are converted when copied into the +# Float64 model matrix +modelcols_term(t::InterceptTerm{true}, data, n::Integer) = ones(n) +modelcols_term(t::InterceptTerm{false}, data, n::Integer) = Matrix{Float64}(undef, n, 0) +modelcols_term(t::ContinuousTerm, data, n::Integer) = getcol(data, t.sym) +modelcols_term(t::CategoricalTerm, data, n::Integer) = t.contrasts[getcol(data, t.sym), :] +modelcols_term(t::InteractionTerm, data, n::Integer) = + StatsModels.row_kron_insideout(*, (modelcols_term(x, data, n) for x in t.terms)...) +modelcols_term(t::FunctionTerm, data, n::Integer) = + t.f.((modelcols_term(x, data, n) for x in t.args)...) +# bare Term and ConstantTerm only appear inside (protected) FunctionTerm arguments +modelcols_term(t::Term, data, n::Integer) = getcol(data, t.sym) +modelcols_term(t::ConstantTerm, data, n::Integer) = t.n +# fallback for exotic term types: use the generic StatsModels path on the +# columns the term needs +function modelcols_term(@nospecialize(t::AbstractTerm), data, n::Integer) + vars = StatsModels.termvars(t) + nt = NamedTuple{(vars...,)}(((getcol(data, s) for s in vars)...,)) + return modelcols(t, nt) +end + +function modelmatrix_vector(ts::Vector{AbstractTerm}, data, n::Integer) + blocks = [modelcols_term(t, data, n) for t in ts if StatsModels.width(t) > 0] + ncols = 0 + for b in blocks + ncols += size(b, 2) + end + X = Matrix{Float64}(undef, n, ncols) + j = 1 + for b in blocks + k = size(b, 2) + copyto!(view(X, :, j:(j + k - 1)), b) + j += k + end + return X +end + +function coefnames_vector(ts::Vector{AbstractTerm}) + out = String[] + for t in ts + StatsModels.width(t) > 0 || continue + append!(out, StatsModels.vectorize(coefnames(t))) + end + return out +end diff --git a/test/fit.jl b/test/fit.jl index 203e2255..e4ac7b75 100644 --- a/test/fit.jl +++ b/test/fit.jl @@ -1,4 +1,4 @@ -using FixedEffectModels, CategoricalArrays, CSV, DataFrames, Test, LinearAlgebra +using FixedEffectModels, CategoricalArrays, CSV, DataFrames, Test, LinearAlgebra, Random using FixedEffectModels: nullloglikelihood_within using CUDA, Metal @@ -873,3 +873,30 @@ end m = reg(df, @formula(y ~ z + fe(id)&x)) @test FixedEffectModels.dof_fes(m) == 2 end + +@testset "reg does not modify the input dataframe" begin + # The model matrices are built from views into the input columns (no + # defensive copy), so the in-place demeaning and weighting steps must + # only ever touch freshly allocated arrays. + Random.seed!(0) + n = 200 + df1 = DataFrame(y = rand(n), x1 = rand(n), x2 = rand(n), + xm = [i % 7 == 0 ? missing : rand() for i in 1:n], + w = rand(n) .+ 0.5, firm = rand(1:10, n), grp = rand(["a", "b", "c"], n), + instr = rand(n)) + snapshot = deepcopy(df1) + reg(df1, @formula(y ~ x1 + x2)) + reg(df1, @formula(y ~ x1 + xm)) + reg(df1, @formula(y ~ x1 + x2 + fe(firm)), save = :all) + reg(df1, @formula(y ~ x1 + fe(firm) + fe(firm)&x2)) + reg(df1, @formula(y ~ x1 + grp + x1&grp)) + reg(df1, @formula(y ~ x1 + (x2 ~ instr))) + reg(df1, @formula(y ~ x1 + log(w))) + reg(df1, @formula(y ~ x1 + x2), weights = :w) + reg(df1, @formula(y ~ x1 + x2 + fe(firm)), weights = :w, save = :residuals) + reg(df1, @formula(y ~ x1 + x2), subset = df1.x1 .> 0.2) + reg(df1, @formula(y ~ x1), Vcov.cluster(:firm)) + for c in names(df1) + @test isequal(df1[!, c], snapshot[!, c]) + end +end From b4f53711e682a3556fac4d05f942f1b38760d295 Mon Sep 17 00:00:00 2001 From: Matthieu Gomez Date: Fri, 28 Aug 2026 17:54:39 -0400 Subject: [PATCH 2/8] Update benchmark timings --- benchmark/benchmark.jl | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/benchmark/benchmark.jl b/benchmark/benchmark.jl index af7e9cbb..2ee0bd89 100755 --- a/benchmark/benchmark.jl +++ b/benchmark/benchmark.jl @@ -1,6 +1,6 @@ using DataFrames, Random, CategoricalArrays @time using FixedEffectModels -# 0.418712 seconds (742.49 k allocations: 45.500 MiB, 4.07% gc time, 1.07% compilation time) +# 0.580477 seconds (632.49 k allocations: 41.519 MiB, 2.80% gc time, 0.84% compilation time) # Very simple setup N = 10000000 K = 100 @@ -12,21 +12,21 @@ y= 3 .* x1 .+ 5 .* x2 .+ cos.(id1) .+ cos.(id2).^2 .+ randn(N) df = DataFrame(id1 = id1, id2 = id2, x1 = x1, x2 = x2, y = y) # first time @time reg(df, @formula(y ~ x1 + x2)) -# 1.810739 seconds (14.05 M allocations: 1.583 GiB, 3.76% gc time, 84.28% compilation time: 91% of which was recompilation) +# 1.328866 seconds (7.87 M allocations: 771.431 MiB, 4.44% gc time, 79.16% compilation time: 94% of which was recompilation) @time reg(df, @formula(y ~ x1 + x2)) -# 0.288344 seconds (712 allocations: 920.405 MiB, 18.71% gc time) +# 0.275951 seconds (322 allocations: 386.311 MiB, 19.27% gc time) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id2)) -# 0.528590 seconds (1.33 M allocations: 1.039 GiB, 8.76% gc time, 55.33% compilation time) +# 0.530246 seconds (1.60 M allocations: 542.123 MiB, 3.19% gc time, 60.83% compilation time) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id2)) -# 0.268619 seconds (879 allocations: 997.916 MiB, 15.08% gc time) +# 0.268264 seconds (490 allocations: 463.822 MiB, 10.66% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1))) -# 0.824536 seconds (3.09 M allocations: 1.426 GiB, 5.37% gc time, 61.39% compilation time: 3% of which was recompilation) +# 0.708850 seconds (2.05 M allocations: 804.701 MiB, 5.09% gc time, 66.27% compilation time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1))) -# 0.356793 seconds (1.41 k allocations: 1.276 GiB, 19.31% gc time) +# 0.317658 seconds (2.78 k allocations: 702.849 MiB, 14.03% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1)), Vcov.cluster(:id1)) -# 0.435500 seconds (495.96 k allocations: 1.381 GiB, 15.97% gc time, 10.72% compilation time) +# 0.433026 seconds (148.71 k allocations: 790.274 MiB, 17.56% gc time, 9.16% compilation time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1) + fe(id2))) -# 1.367264 seconds (1.91 M allocations: 1.592 GiB, 5.74% gc time, 23.85% compilation time: 20% of which was recompilation) +# 0.903748 seconds (404.27 k allocations: 875.213 MiB, 10.17% gc time, 21.63% compilation time) # More complicated setup N = 800000 # number of observations @@ -39,12 +39,11 @@ x2 = cos.(id1) + sin.(id2) + randn(N) y= 3 .* x1 .+ 5 .* x2 .+ cos.(id1) .+ cos.(id2).^2 .+ randn(N) df = DataFrame(id1 = id1, id2 = id2, x1 = x1, x2 = x2, y = y) @time reg(df, @formula(y ~ x1 + x2 + fe(id1) + fe(id2))) -# 1.546023 seconds (19.89 k allocations: 119.673 MiB, 1.70% gc time) +# 0.790119 seconds (92.25 k allocations: 75.734 MiB, 3.99% gc time) @time reg(df, @formula(y ~ x1 + fe(id1) + fe(id1)&x2 + fe(id2) + fe(id2)&x2)) -# 1.679007 seconds (3.61 M allocations: 334.110 MiB, 2.31% gc time, 45.11% compilation time: <1% of which was recompilation) +# 1.365713 seconds (1.87 M allocations: 205.596 MiB, 2.98% gc time, 39.06% compilation time) @time reg(df, @formula(y ~ fe(id1)*x1 + fe(id2)*x2)) -# 4.245766 seconds (3.18 M allocations: 336.433 MiB, 0.46% gc time, 16.92% compilation time) - +# 0.516583 seconds (678.56 k allocations: 144.636 MiB, 2.77% gc time, 20.37% compilation time) @@ -57,11 +56,11 @@ id1 = categorical(rand(1:nb_dum[1], n)) id2 = categorical(rand(1:nb_dum[2], n)) id3 = categorical(rand(1:nb_dum[3], n)) X1 = rand(n) -ln_y = 3 .* X1 .+ rand(n) +ln_y = 3 .* X1 .+ rand(n) df = DataFrame(X1 = X1, ln_y = ln_y, id1 = id1, id2 = id2, id3 = id3) @time reg(df, @formula(ln_y ~ X1 + fe(id1)), Vcov.cluster(:id1)) -# 0.311420 seconds (1.35 k allocations: 1.052 GiB, 22.30% gc time) +# 0.952912 seconds (4.06 M allocations: 892.628 MiB, 4.22% gc time, 69.77% compilation time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2)), Vcov.cluster(:id1)) -# 0.808992 seconds (3.52 k allocations: 1.272 GiB, 8.68% gc time) +# 1.206156 seconds (1.77 M allocations: 1.152 GiB, 5.81% gc time, 40.53% compilation time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2) + fe(id3)), Vcov.cluster(:id1)) -# 0.950808 seconds (4.75 k allocations: 1.496 GiB, 7.48% gc time) +# 0.998796 seconds (327.33 k allocations: 1.307 GiB, 8.67% gc time, 15.16% compilation time) From 9877471d06229b620b2393e2facbe081f2d6127c Mon Sep 17 00:00:00 2001 From: Matthieu Gomez Date: Fri, 28 Aug 2026 17:56:28 -0400 Subject: [PATCH 3/8] Run each fixest benchmark twice (cold and warm) --- benchmark/benchmark.jl | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/benchmark/benchmark.jl b/benchmark/benchmark.jl index 2ee0bd89..36c47c72 100755 --- a/benchmark/benchmark.jl +++ b/benchmark/benchmark.jl @@ -1,6 +1,6 @@ using DataFrames, Random, CategoricalArrays @time using FixedEffectModels -# 0.580477 seconds (632.49 k allocations: 41.519 MiB, 2.80% gc time, 0.84% compilation time) +# 0.416951 seconds (632.49 k allocations: 41.519 MiB, 2.81% gc time, 1.04% compilation time) # Very simple setup N = 10000000 K = 100 @@ -12,21 +12,21 @@ y= 3 .* x1 .+ 5 .* x2 .+ cos.(id1) .+ cos.(id2).^2 .+ randn(N) df = DataFrame(id1 = id1, id2 = id2, x1 = x1, x2 = x2, y = y) # first time @time reg(df, @formula(y ~ x1 + x2)) -# 1.328866 seconds (7.87 M allocations: 771.431 MiB, 4.44% gc time, 79.16% compilation time: 94% of which was recompilation) +# 2.079799 seconds (7.87 M allocations: 771.431 MiB, 5.29% gc time, 82.48% compilation time: 96% of which was recompilation) @time reg(df, @formula(y ~ x1 + x2)) -# 0.275951 seconds (322 allocations: 386.311 MiB, 19.27% gc time) +# 0.360490 seconds (322 allocations: 386.311 MiB, 15.31% gc time) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id2)) -# 0.530246 seconds (1.60 M allocations: 542.123 MiB, 3.19% gc time, 60.83% compilation time) +# 0.580137 seconds (1.60 M allocations: 542.123 MiB, 6.76% gc time, 57.67% compilation time: 14% of which was recompilation) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id2)) -# 0.268264 seconds (490 allocations: 463.822 MiB, 10.66% gc time) +# 0.267717 seconds (490 allocations: 463.822 MiB, 13.42% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1))) -# 0.708850 seconds (2.05 M allocations: 804.701 MiB, 5.09% gc time, 66.27% compilation time) +# 0.728273 seconds (2.05 M allocations: 804.700 MiB, 5.36% gc time, 65.15% compilation time: 63% of which was recompilation) @time reg(df, @formula(y ~ x1 + x2 + fe(id1))) -# 0.317658 seconds (2.78 k allocations: 702.849 MiB, 14.03% gc time) +# 0.319863 seconds (2.78 k allocations: 702.849 MiB, 14.55% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1)), Vcov.cluster(:id1)) -# 0.433026 seconds (148.71 k allocations: 790.274 MiB, 17.56% gc time, 9.16% compilation time) +# 0.398538 seconds (148.71 k allocations: 790.275 MiB, 18.14% gc time, 6.71% compilation time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1) + fe(id2))) -# 0.903748 seconds (404.27 k allocations: 875.213 MiB, 10.17% gc time, 21.63% compilation time) +# 0.696066 seconds (404.26 k allocations: 875.212 MiB, 6.05% gc time, 21.59% compilation time) # More complicated setup N = 800000 # number of observations @@ -39,11 +39,11 @@ x2 = cos.(id1) + sin.(id2) + randn(N) y= 3 .* x1 .+ 5 .* x2 .+ cos.(id1) .+ cos.(id2).^2 .+ randn(N) df = DataFrame(id1 = id1, id2 = id2, x1 = x1, x2 = x2, y = y) @time reg(df, @formula(y ~ x1 + x2 + fe(id1) + fe(id2))) -# 0.790119 seconds (92.25 k allocations: 75.734 MiB, 3.99% gc time) +# 0.669781 seconds (76.06 k allocations: 72.184 MiB, 6.77% gc time) @time reg(df, @formula(y ~ x1 + fe(id1) + fe(id1)&x2 + fe(id2) + fe(id2)&x2)) -# 1.365713 seconds (1.87 M allocations: 205.596 MiB, 2.98% gc time, 39.06% compilation time) +# 1.342872 seconds (1.87 M allocations: 205.454 MiB, 2.90% gc time, 41.52% compilation time) @time reg(df, @formula(y ~ fe(id1)*x1 + fe(id2)*x2)) -# 0.516583 seconds (678.56 k allocations: 144.636 MiB, 2.77% gc time, 20.37% compilation time) +# 0.623492 seconds (684.57 k allocations: 135.691 MiB, 6.71% gc time, 17.00% compilation time) @@ -59,8 +59,14 @@ X1 = rand(n) ln_y = 3 .* X1 .+ rand(n) df = DataFrame(X1 = X1, ln_y = ln_y, id1 = id1, id2 = id2, id3 = id3) @time reg(df, @formula(ln_y ~ X1 + fe(id1)), Vcov.cluster(:id1)) -# 0.952912 seconds (4.06 M allocations: 892.628 MiB, 4.22% gc time, 69.77% compilation time) +# 0.923952 seconds (4.06 M allocations: 892.628 MiB, 3.97% gc time, 69.77% compilation time) +@time reg(df, @formula(ln_y ~ X1 + fe(id1)), Vcov.cluster(:id1)) +# 0.403069 seconds (2.26 k allocations: 654.682 MiB, 10.13% gc time) +@time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2)), Vcov.cluster(:id1)) +# 1.294296 seconds (1.77 M allocations: 1.189 GiB, 7.65% gc time, 38.80% compilation time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2)), Vcov.cluster(:id1)) -# 1.206156 seconds (1.77 M allocations: 1.152 GiB, 5.81% gc time, 40.53% compilation time) +# 1.022833 seconds (6.28 k allocations: 1.068 GiB, 7.29% gc time) +@time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2) + fe(id3)), Vcov.cluster(:id1)) +# 1.053856 seconds (327.33 k allocations: 1.381 GiB, 10.49% gc time, 15.26% compilation time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2) + fe(id3)), Vcov.cluster(:id1)) -# 0.998796 seconds (327.33 k allocations: 1.307 GiB, 8.67% gc time, 15.16% compilation time) +# 1.302102 seconds (8.01 k allocations: 1.217 GiB, 4.49% gc time) From 97dfeffc5e8e60a01c5b0128b08ceeeeb57c7d5d Mon Sep 17 00:00:00 2001 From: Matthieu Gomez Date: Fri, 28 Aug 2026 18:07:10 -0400 Subject: [PATCH 4/8] Rerun benchmarks --- benchmark/benchmark.jl | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/benchmark/benchmark.jl b/benchmark/benchmark.jl index 36c47c72..ea40e26b 100755 --- a/benchmark/benchmark.jl +++ b/benchmark/benchmark.jl @@ -1,6 +1,6 @@ using DataFrames, Random, CategoricalArrays @time using FixedEffectModels -# 0.416951 seconds (632.49 k allocations: 41.519 MiB, 2.81% gc time, 1.04% compilation time) +# 0.497405 seconds (633.17 k allocations: 41.566 MiB, 8.54% gc time, 0.89% compilation time) # Very simple setup N = 10000000 K = 100 @@ -12,21 +12,21 @@ y= 3 .* x1 .+ 5 .* x2 .+ cos.(id1) .+ cos.(id2).^2 .+ randn(N) df = DataFrame(id1 = id1, id2 = id2, x1 = x1, x2 = x2, y = y) # first time @time reg(df, @formula(y ~ x1 + x2)) -# 2.079799 seconds (7.87 M allocations: 771.431 MiB, 5.29% gc time, 82.48% compilation time: 96% of which was recompilation) +# 1.336506 seconds (7.87 M allocations: 771.431 MiB, 5.21% gc time, 77.16% compilation time: 94% of which was recompilation) @time reg(df, @formula(y ~ x1 + x2)) -# 0.360490 seconds (322 allocations: 386.311 MiB, 15.31% gc time) +# 0.307350 seconds (322 allocations: 386.311 MiB, 20.61% gc time) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id2)) -# 0.580137 seconds (1.60 M allocations: 542.123 MiB, 6.76% gc time, 57.67% compilation time: 14% of which was recompilation) +# 0.515049 seconds (1.60 M allocations: 542.123 MiB, 2.24% gc time, 60.82% compilation time: 11% of which was recompilation) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id2)) -# 0.267717 seconds (490 allocations: 463.822 MiB, 13.42% gc time) +# 0.270209 seconds (490 allocations: 463.822 MiB, 10.28% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1))) -# 0.728273 seconds (2.05 M allocations: 804.700 MiB, 5.36% gc time, 65.15% compilation time: 63% of which was recompilation) +# 0.787299 seconds (2.05 M allocations: 804.700 MiB, 5.75% gc time, 66.80% compilation time: 60% of which was recompilation) @time reg(df, @formula(y ~ x1 + x2 + fe(id1))) -# 0.319863 seconds (2.78 k allocations: 702.849 MiB, 14.55% gc time) +# 0.352568 seconds (2.78 k allocations: 702.849 MiB, 14.56% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1)), Vcov.cluster(:id1)) -# 0.398538 seconds (148.71 k allocations: 790.275 MiB, 18.14% gc time, 6.71% compilation time) +# 0.435032 seconds (148.71 k allocations: 790.274 MiB, 18.25% gc time, 6.84% compilation time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1) + fe(id2))) -# 0.696066 seconds (404.26 k allocations: 875.212 MiB, 6.05% gc time, 21.59% compilation time) +# 0.814278 seconds (404.28 k allocations: 875.213 MiB, 5.05% gc time, 20.53% compilation time) # More complicated setup N = 800000 # number of observations @@ -39,11 +39,11 @@ x2 = cos.(id1) + sin.(id2) + randn(N) y= 3 .* x1 .+ 5 .* x2 .+ cos.(id1) .+ cos.(id2).^2 .+ randn(N) df = DataFrame(id1 = id1, id2 = id2, x1 = x1, x2 = x2, y = y) @time reg(df, @formula(y ~ x1 + x2 + fe(id1) + fe(id2))) -# 0.669781 seconds (76.06 k allocations: 72.184 MiB, 6.77% gc time) +# 0.866437 seconds (96.98 k allocations: 69.788 MiB, 0.33% gc time) @time reg(df, @formula(y ~ x1 + fe(id1) + fe(id1)&x2 + fe(id2) + fe(id2)&x2)) -# 1.342872 seconds (1.87 M allocations: 205.454 MiB, 2.90% gc time, 41.52% compilation time) +# 1.663603 seconds (1.89 M allocations: 205.990 MiB, 0.26% gc time, 36.53% compilation time) @time reg(df, @formula(y ~ fe(id1)*x1 + fe(id2)*x2)) -# 0.623492 seconds (684.57 k allocations: 135.691 MiB, 6.71% gc time, 17.00% compilation time) +# 0.551153 seconds (673.28 k allocations: 135.326 MiB, 2.18% gc time, 21.33% compilation time) @@ -59,14 +59,14 @@ X1 = rand(n) ln_y = 3 .* X1 .+ rand(n) df = DataFrame(X1 = X1, ln_y = ln_y, id1 = id1, id2 = id2, id3 = id3) @time reg(df, @formula(ln_y ~ X1 + fe(id1)), Vcov.cluster(:id1)) -# 0.923952 seconds (4.06 M allocations: 892.628 MiB, 3.97% gc time, 69.77% compilation time) +# 0.957912 seconds (4.06 M allocations: 854.487 MiB, 4.34% gc time, 72.85% compilation time) @time reg(df, @formula(ln_y ~ X1 + fe(id1)), Vcov.cluster(:id1)) -# 0.403069 seconds (2.26 k allocations: 654.682 MiB, 10.13% gc time) +# 0.335721 seconds (2.26 k allocations: 645.557 MiB, 12.05% gc time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2)), Vcov.cluster(:id1)) -# 1.294296 seconds (1.77 M allocations: 1.189 GiB, 7.65% gc time, 38.80% compilation time) +# 1.241810 seconds (1.77 M allocations: 1.143 GiB, 6.78% gc time, 39.60% compilation time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2)), Vcov.cluster(:id1)) -# 1.022833 seconds (6.28 k allocations: 1.068 GiB, 7.29% gc time) +# 0.830758 seconds (6.28 k allocations: 1.015 GiB, 6.23% gc time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2) + fe(id3)), Vcov.cluster(:id1)) -# 1.053856 seconds (327.33 k allocations: 1.381 GiB, 10.49% gc time, 15.26% compilation time) +# 0.978856 seconds (327.33 k allocations: 1.331 GiB, 8.08% gc time, 15.23% compilation time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2) + fe(id3)), Vcov.cluster(:id1)) -# 1.302102 seconds (8.01 k allocations: 1.217 GiB, 4.49% gc time) +# 0.986598 seconds (8.01 k allocations: 1.315 GiB, 13.37% gc time) From 7722ae67d34dcdf9e2b8af560425d310f3890f1a Mon Sep 17 00:00:00 2001 From: Matthieu Gomez Date: Fri, 28 Aug 2026 18:11:26 -0400 Subject: [PATCH 5/8] Load CategoricalArrays only for the fixest benchmarks Loading it up front invalidates the precompiled pipeline, inflating the earlier first-call timings with recompilation --- benchmark/benchmark.jl | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/benchmark/benchmark.jl b/benchmark/benchmark.jl index ea40e26b..37590d50 100755 --- a/benchmark/benchmark.jl +++ b/benchmark/benchmark.jl @@ -1,6 +1,6 @@ -using DataFrames, Random, CategoricalArrays +using DataFrames, Random @time using FixedEffectModels -# 0.497405 seconds (633.17 k allocations: 41.566 MiB, 8.54% gc time, 0.89% compilation time) +# 0.516901 seconds (625.23 k allocations: 41.157 MiB, 2.71% gc time, 0.94% compilation time) # Very simple setup N = 10000000 K = 100 @@ -12,21 +12,21 @@ y= 3 .* x1 .+ 5 .* x2 .+ cos.(id1) .+ cos.(id2).^2 .+ randn(N) df = DataFrame(id1 = id1, id2 = id2, x1 = x1, x2 = x2, y = y) # first time @time reg(df, @formula(y ~ x1 + x2)) -# 1.336506 seconds (7.87 M allocations: 771.431 MiB, 5.21% gc time, 77.16% compilation time: 94% of which was recompilation) +# 0.336580 seconds (3.45 k allocations: 386.446 MiB, 9.03% gc time, 10.83% compilation time) @time reg(df, @formula(y ~ x1 + x2)) -# 0.307350 seconds (322 allocations: 386.311 MiB, 20.61% gc time) +# 0.333338 seconds (319 allocations: 386.311 MiB, 2.54% gc time) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id2)) -# 0.515049 seconds (1.60 M allocations: 542.123 MiB, 2.24% gc time, 60.82% compilation time: 11% of which was recompilation) +# 0.374062 seconds (163.68 k allocations: 471.621 MiB, 10.13% gc time, 29.99% compilation time) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id2)) -# 0.270209 seconds (490 allocations: 463.822 MiB, 10.28% gc time) +# 0.305426 seconds (487 allocations: 463.822 MiB, 16.44% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1))) -# 0.787299 seconds (2.05 M allocations: 804.700 MiB, 5.75% gc time, 66.80% compilation time: 60% of which was recompilation) +# 0.414578 seconds (187.02 k allocations: 711.918 MiB, 8.96% gc time, 32.54% compilation time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1))) -# 0.352568 seconds (2.78 k allocations: 702.849 MiB, 14.56% gc time) +# 0.357588 seconds (2.78 k allocations: 702.849 MiB, 15.50% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1)), Vcov.cluster(:id1)) -# 0.435032 seconds (148.71 k allocations: 790.274 MiB, 18.25% gc time, 6.84% compilation time) +# 0.431498 seconds (148.75 k allocations: 790.275 MiB, 15.95% gc time, 8.58% compilation time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1) + fe(id2))) -# 0.814278 seconds (404.28 k allocations: 875.213 MiB, 5.05% gc time, 20.53% compilation time) +# 0.752960 seconds (404.36 k allocations: 913.359 MiB, 9.25% gc time, 21.47% compilation time) # More complicated setup N = 800000 # number of observations @@ -39,16 +39,17 @@ x2 = cos.(id1) + sin.(id2) + randn(N) y= 3 .* x1 .+ 5 .* x2 .+ cos.(id1) .+ cos.(id2).^2 .+ randn(N) df = DataFrame(id1 = id1, id2 = id2, x1 = x1, x2 = x2, y = y) @time reg(df, @formula(y ~ x1 + x2 + fe(id1) + fe(id2))) -# 0.866437 seconds (96.98 k allocations: 69.788 MiB, 0.33% gc time) +# 0.849341 seconds (90.62 k allocations: 69.590 MiB) @time reg(df, @formula(y ~ x1 + fe(id1) + fe(id1)&x2 + fe(id2) + fe(id2)&x2)) -# 1.663603 seconds (1.89 M allocations: 205.990 MiB, 0.26% gc time, 36.53% compilation time) +# 1.594869 seconds (1.86 M allocations: 198.844 MiB, 0.78% gc time, 38.12% compilation time) @time reg(df, @formula(y ~ fe(id1)*x1 + fe(id2)*x2)) -# 0.551153 seconds (673.28 k allocations: 135.326 MiB, 2.18% gc time, 21.33% compilation time) +# 0.681447 seconds (675.00 k allocations: 147.447 MiB, 4.64% gc time, 19.71% compilation time) # fixest +using CategoricalArrays n = 10_000_000 nb_dum = [div(n,20), floor(Int, sqrt(n)), floor(Int, n^.33)] N = nb_dum.^3 @@ -59,14 +60,14 @@ X1 = rand(n) ln_y = 3 .* X1 .+ rand(n) df = DataFrame(X1 = X1, ln_y = ln_y, id1 = id1, id2 = id2, id3 = id3) @time reg(df, @formula(ln_y ~ X1 + fe(id1)), Vcov.cluster(:id1)) -# 0.957912 seconds (4.06 M allocations: 854.487 MiB, 4.34% gc time, 72.85% compilation time) +# 2.384253 seconds (14.46 M allocations: 1.324 GiB, 5.22% gc time, 88.63% compilation time: 68% of which was recompilation) @time reg(df, @formula(ln_y ~ X1 + fe(id1)), Vcov.cluster(:id1)) -# 0.335721 seconds (2.26 k allocations: 645.557 MiB, 12.05% gc time) +# 0.281829 seconds (2.26 k allocations: 629.588 MiB, 4.09% gc time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2)), Vcov.cluster(:id1)) -# 1.241810 seconds (1.77 M allocations: 1.143 GiB, 6.78% gc time, 39.60% compilation time) +# 1.249629 seconds (1.77 M allocations: 1.084 GiB, 6.24% gc time, 41.52% compilation time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2)), Vcov.cluster(:id1)) -# 0.830758 seconds (6.28 k allocations: 1.015 GiB, 6.23% gc time) +# 0.812104 seconds (6.28 k allocations: 1.001 GiB, 9.90% gc time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2) + fe(id3)), Vcov.cluster(:id1)) -# 0.978856 seconds (327.33 k allocations: 1.331 GiB, 8.08% gc time, 15.23% compilation time) +# 1.133076 seconds (327.35 k allocations: 1.278 GiB, 7.99% gc time, 13.74% compilation time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2) + fe(id3)), Vcov.cluster(:id1)) -# 0.986598 seconds (8.01 k allocations: 1.315 GiB, 13.37% gc time) +# 1.024502 seconds (8.01 k allocations: 1.260 GiB, 11.05% gc time) From 84b15b8480127e27db8df94927e702db6b85feed Mon Sep 17 00:00:00 2001 From: Matthieu Gomez Date: Fri, 28 Aug 2026 18:11:51 -0400 Subject: [PATCH 6/8] Comment on CategoricalArrays invalidations in benchmark --- benchmark/benchmark.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmark/benchmark.jl b/benchmark/benchmark.jl index 37590d50..15aaad9e 100755 --- a/benchmark/benchmark.jl +++ b/benchmark/benchmark.jl @@ -59,6 +59,7 @@ id3 = categorical(rand(1:nb_dum[3], n)) X1 = rand(n) ln_y = 3 .* X1 .+ rand(n) df = DataFrame(X1 = X1, ln_y = ln_y, id1 = id1, id2 = id2, id3 = id3) +# the first call recompiles code invalidated by loading CategoricalArrays @time reg(df, @formula(ln_y ~ X1 + fe(id1)), Vcov.cluster(:id1)) # 2.384253 seconds (14.46 M allocations: 1.324 GiB, 5.22% gc time, 88.63% compilation time: 68% of which was recompilation) @time reg(df, @formula(ln_y ~ X1 + fe(id1)), Vcov.cluster(:id1)) From fccdccfa80ba9ea033b4af5729b2b938e79650d2 Mon Sep 17 00:00:00 2001 From: Matthieu Gomez Date: Fri, 28 Aug 2026 18:44:49 -0400 Subject: [PATCH 7/8] Skip unused column statistics when building the schema concrete_term fills ContinuousTerm's mean/var/min/max with three O(n) passes per continuous column; nothing downstream reads them. Store NaN placeholders instead (and build one schema shared by Y and X in partial_out), roughly halving warm reg time on 10M-row benchmarks. --- src/partial_out.jl | 7 +++++-- src/utils/vectorterms.jl | 11 ++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/partial_out.jl b/src/partial_out.jl index 6095d9da..1ab67d6c 100644 --- a/src/partial_out.jl +++ b/src/partial_out.jl @@ -106,8 +106,11 @@ function partial_out( # Compute residualized Y vars = unique(StatsModels.termvars(formula)) subdf = Tables.columntable(disallowmissing!(df[esample, vars])) + # one pass over the variables, skipping the unused per-column statistics + # (see build_schema); the same schema serves both Y and X below + sch = build_schema(vars, subdf, contrasts) formula_y = FormulaTerm(ConstantTerm(0), (ConstantTerm(0), eachterm(formula.lhs)...)) - formula_y_schema = apply_schema(formula_y, schema(formula_y, subdf, contrasts), StatisticalModel) + formula_y_schema = apply_schema(formula_y, sch, StatisticalModel) Y = convert(Matrix{Float64}, modelmatrix(formula_y_schema, subdf)) ynames = coefnames(formula_y_schema)[2] @@ -125,7 +128,7 @@ function partial_out( # Compute residualized X formula_x = FormulaTerm(ConstantTerm(0), formula.rhs) - formula_x_schema = apply_schema(formula_x, schema(formula_x, subdf, contrasts), StatisticalModel) + formula_x_schema = apply_schema(formula_x, sch, StatisticalModel) X = convert(Matrix{Float64}, modelmatrix(formula_x_schema, subdf)) if has_fes _, b, c = solve_residuals!(eachcol(X), feM; maxiter = maxiter, tol = tol, progress_bar = false) diff --git a/src/utils/vectorterms.jl b/src/utils/vectorterms.jl index d2a541ef..f1b4aecc 100644 --- a/src/utils/vectorterms.jl +++ b/src/utils/vectorterms.jl @@ -97,7 +97,16 @@ function build_schema(vars::Vector{Symbol}, data, contrasts::Dict) sch = StatsModels.Schema() for s in vars t = Term(s) - sch.schema[t] = StatsModels.concrete_term(t, getcol(data, s), get(contrasts, s, nothing)) + col = getcol(data, s) + hint = get(contrasts, s, nothing) + if hint === nothing && eltype(col) <: Number + # concrete_term fills ContinuousTerm's mean/var/min/max with three + # O(n) passes over the column (mean_and_var + extrema); nothing here + # reads those fields, so store NaN placeholders instead + sch.schema[t] = ContinuousTerm(s, NaN, NaN, NaN, NaN) + else + sch.schema[t] = StatsModels.concrete_term(t, col, hint) + end end return sch end From bfb697c81f127e37feb0e203fe264b19bdaaa53b Mon Sep 17 00:00:00 2001 From: Matthieu Gomez Date: Fri, 28 Aug 2026 18:44:56 -0400 Subject: [PATCH 8/8] Rerun benchmarks against fixest, lfe, and reghdfe - Update benchmark.md with fresh timings for all four packages on the same machine (Apple M4): FixedEffectModels 2.1.0 / Julia 1.12.7, fixest 0.13.2 and lfe 3.1.1 on R 4.4.2, reghdfe 5.7.3 / ivreg2 4.1.11 on Stata 19 MP - Regenerate the comparison graph and point benchmark.md to the repo png (the old rawgit link is dead) - Restore newlines in benchmark.csv and result.jl (both had been mangled onto one line) and make result.jl read benchmark.csv relative to the script - Refresh benchmark.jl timing comments after the schema speedup - Remove the clustered-standard-errors claim from the README benchmark paragraph --- README.md | 2 +- benchmark/benchmark.csv | 7 ++- benchmark/benchmark.jl | 36 +++++++-------- benchmark/benchmark.md | 52 +++++++++++----------- benchmark/fixedeffectmodels_benchmark.png | Bin 128533 -> 57650 bytes benchmark/result.jl | 22 ++++++++- 6 files changed, 73 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index fa3c9528..d77f8c53 100755 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This package estimates linear models with high dimensional categorical variables The package is registered in the [`General`](https://github.com/JuliaRegistries/General) registry and so can be installed at the REPL with `] add FixedEffectModels`. ## Benchmarks -The objective of the package is similar to the Stata command [`reghdfe`](https://github.com/sergiocorreia/reghdfe) and the R packages [`lfe`](https://cran.r-project.org/web/packages/lfe/lfe.pdf) and [`fixest`](https://lrberge.github.io/fixest/). The package is much faster than `reghdfe` (Stata) or `lfe` (R). It also tends to be a bit faster than the more recent `fixest` (R), especially when computing clustered standard errors. `FixedEffectModels` can also run on NVIDIA or Apple GPUs for even faster performances (see below) +The objective of the package is similar to the Stata command [`reghdfe`](https://github.com/sergiocorreia/reghdfe) and the R packages [`lfe`](https://cran.r-project.org/web/packages/lfe/lfe.pdf) and [`fixest`](https://lrberge.github.io/fixest/). The package is much faster than `reghdfe` (Stata) or `lfe` (R). It also tends to be a bit faster than the more recent `fixest` (R). `FixedEffectModels` can also run on NVIDIA or Apple GPUs for even faster performances (see below) ![benchmark](http://www.matthieugomez.com/files/fixedeffectmodels_benchmark.png) diff --git a/benchmark/benchmark.csv b/benchmark/benchmark.csv index b72424db..a87e9682 100644 --- a/benchmark/benchmark.csv +++ b/benchmark/benchmark.csv @@ -1 +1,6 @@ -Order,Command,FixedEffectModels.jl (Julia),fixest (R),lfe (R),reghdfe (Stata) 1,simple,0.35,0.317,1.843, 0.61 2,1 hd fe,0.463 ,0.704 ,14.831, 4.64 3,2 hd fe,1.00,1.297 ,10.626, 22.99 4, 1 cluster se,0.38058,0.700 ,9.255, 8.28 5, 2 clusters se,0.765,1.803,96.958, 70.44 \ No newline at end of file +Order,Command,FixedEffectModels.jl (Julia),fixest (R),lfe (R),reg / reghdfe (Stata) +1,simple,0.134,0.354,0.914,0.46 +2,1 hd fe,0.204,0.444,5.770,2.67 +3,2 hd fe,0.490,0.770,3.504,15.14 +4,1 cluster se,0.118,0.498,3.271,6.44 +5,2 clusters se,0.385,1.449,49.466,35.71 diff --git a/benchmark/benchmark.jl b/benchmark/benchmark.jl index 15aaad9e..518c773b 100755 --- a/benchmark/benchmark.jl +++ b/benchmark/benchmark.jl @@ -1,6 +1,6 @@ using DataFrames, Random @time using FixedEffectModels -# 0.516901 seconds (625.23 k allocations: 41.157 MiB, 2.71% gc time, 0.94% compilation time) +# 0.442555 seconds (624.29 k allocations: 41.117 MiB, 2.59% gc time, 1.01% compilation time) # Very simple setup N = 10000000 K = 100 @@ -12,21 +12,21 @@ y= 3 .* x1 .+ 5 .* x2 .+ cos.(id1) .+ cos.(id2).^2 .+ randn(N) df = DataFrame(id1 = id1, id2 = id2, x1 = x1, x2 = x2, y = y) # first time @time reg(df, @formula(y ~ x1 + x2)) -# 0.336580 seconds (3.45 k allocations: 386.446 MiB, 9.03% gc time, 10.83% compilation time) +# 0.175934 seconds (3.43 k allocations: 386.445 MiB, 5.27% gc time, 21.75% compilation time) @time reg(df, @formula(y ~ x1 + x2)) -# 0.333338 seconds (319 allocations: 386.311 MiB, 2.54% gc time) +# 0.198124 seconds (310 allocations: 386.310 MiB, 16.34% gc time) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id2)) -# 0.374062 seconds (163.68 k allocations: 471.621 MiB, 10.13% gc time, 29.99% compilation time) +# 0.221376 seconds (163.66 k allocations: 471.871 MiB, 19.93% gc time, 43.55% compilation time) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id2)) -# 0.305426 seconds (487 allocations: 463.822 MiB, 16.44% gc time) +# 0.124714 seconds (478 allocations: 463.822 MiB, 6.91% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1))) -# 0.414578 seconds (187.02 k allocations: 711.918 MiB, 8.96% gc time, 32.54% compilation time) +# 0.251411 seconds (187.01 k allocations: 673.778 MiB, 15.87% gc time, 52.26% compilation time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1))) -# 0.357588 seconds (2.78 k allocations: 702.849 MiB, 15.50% gc time) +# 0.209155 seconds (2.77 k allocations: 702.849 MiB, 32.16% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1)), Vcov.cluster(:id1)) -# 0.431498 seconds (148.75 k allocations: 790.275 MiB, 15.95% gc time, 8.58% compilation time) +# 0.242202 seconds (148.74 k allocations: 752.135 MiB, 14.90% gc time, 12.01% compilation time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1) + fe(id2))) -# 0.752960 seconds (404.36 k allocations: 913.359 MiB, 9.25% gc time, 21.47% compilation time) +# 0.594494 seconds (404.37 k allocations: 913.358 MiB, 11.85% gc time, 26.83% compilation time) # More complicated setup N = 800000 # number of observations @@ -39,11 +39,11 @@ x2 = cos.(id1) + sin.(id2) + randn(N) y= 3 .* x1 .+ 5 .* x2 .+ cos.(id1) .+ cos.(id2).^2 .+ randn(N) df = DataFrame(id1 = id1, id2 = id2, x1 = x1, x2 = x2, y = y) @time reg(df, @formula(y ~ x1 + x2 + fe(id1) + fe(id2))) -# 0.849341 seconds (90.62 k allocations: 69.590 MiB) +# 0.727029 seconds (84.78 k allocations: 69.409 MiB, 4.53% gc time) @time reg(df, @formula(y ~ x1 + fe(id1) + fe(id1)&x2 + fe(id2) + fe(id2)&x2)) -# 1.594869 seconds (1.86 M allocations: 198.844 MiB, 0.78% gc time, 38.12% compilation time) +# 1.262707 seconds (1.85 M allocations: 204.607 MiB, 3.03% gc time, 43.07% compilation time) @time reg(df, @formula(y ~ fe(id1)*x1 + fe(id2)*x2)) -# 0.681447 seconds (675.00 k allocations: 147.447 MiB, 4.64% gc time, 19.71% compilation time) +# 0.525260 seconds (669.35 k allocations: 141.178 MiB, 7.81% gc time, 28.31% compilation time) @@ -61,14 +61,14 @@ ln_y = 3 .* X1 .+ rand(n) df = DataFrame(X1 = X1, ln_y = ln_y, id1 = id1, id2 = id2, id3 = id3) # the first call recompiles code invalidated by loading CategoricalArrays @time reg(df, @formula(ln_y ~ X1 + fe(id1)), Vcov.cluster(:id1)) -# 2.384253 seconds (14.46 M allocations: 1.324 GiB, 5.22% gc time, 88.63% compilation time: 68% of which was recompilation) +# 2.247757 seconds (14.46 M allocations: 1.324 GiB, 3.71% gc time, 91.03% compilation time: 67% of which was recompilation) @time reg(df, @formula(ln_y ~ X1 + fe(id1)), Vcov.cluster(:id1)) -# 0.281829 seconds (2.26 k allocations: 629.588 MiB, 4.09% gc time) +# 0.198736 seconds (2.26 k allocations: 636.432 MiB, 23.03% gc time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2)), Vcov.cluster(:id1)) -# 1.249629 seconds (1.77 M allocations: 1.084 GiB, 6.24% gc time, 41.52% compilation time) +# 1.093537 seconds (1.77 M allocations: 1.125 GiB, 6.85% gc time, 43.38% compilation time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2)), Vcov.cluster(:id1)) -# 0.812104 seconds (6.28 k allocations: 1.001 GiB, 9.90% gc time) +# 0.661163 seconds (6.27 k allocations: 1.006 GiB, 12.54% gc time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2) + fe(id3)), Vcov.cluster(:id1)) -# 1.133076 seconds (327.35 k allocations: 1.278 GiB, 7.99% gc time, 13.74% compilation time) +# 0.855344 seconds (327.35 k allocations: 1.280 GiB, 10.46% gc time, 17.11% compilation time) @time reg(df, @formula(ln_y ~ X1 + fe(id1) + fe(id2) + fe(id3)), Vcov.cluster(:id1)) -# 1.024502 seconds (8.01 k allocations: 1.260 GiB, 11.05% gc time) +# 0.782286 seconds (8.00 k allocations: 1.265 GiB, 10.83% gc time) diff --git a/benchmark/benchmark.md b/benchmark/benchmark.md index 3b9fb495..7f496a60 100755 --- a/benchmark/benchmark.md +++ b/benchmark/benchmark.md @@ -1,9 +1,10 @@ ### Simple benchmark -![benchmark](https://cdn.rawgit.com/matthieugomez/FixedEffectModels.jl/4c7d1db39377f1ee649624c909c9017f92484114/benchmark/result.svg) +![benchmark](fixedeffectmodels_benchmark.png) +All timings below are from the same machine (Apple M4, 16GB RAM, 2026-08-28). Code to reproduce this graph: - FixedEffectModels.jl v1.9.0 (Julia 1.9) + FixedEffectModels.jl v2.1.0 (Julia 1.12.7, started with `julia -t auto`; timings are warm calls) ```julia using DataFrames, CategoricalArrays, FixedEffectModels N = 10_000_000 @@ -15,19 +16,19 @@ Code to reproduce this graph: y= 3 .* x1 .+ 2 .* x2 .+ sin.(id1) .+ cos.(id2).^2 .+ randn(N) df = DataFrame(id1 = categorical(id1), id2 = categorical(id2), x1 = x1, x2 = x2, y = y) @time reg(df, @formula(y ~ x1 + x2)) - # 0.338749 seconds (450 allocations: 691.441 MiB, 2.30% gc time) + # 0.133884 seconds (313 allocations: 386.310 MiB, 1.42% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1))) - # 0.463058 seconds (1.00 k allocations: 929.129 MiB, 13.31% gc time) + # 0.203769 seconds (2.75 k allocations: 664.707 MiB, 28.83% gc time) @time reg(df, @formula(y ~ x1 + x2 + fe(id1) + fe(id2))) - # 1.006031 seconds (3.22 k allocations: 1.057 GiB, 1.68% gc time) + # 0.489542 seconds (7.22 k allocations: 893.853 MiB, 17.39% gc time) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id1)) - # 0.380562 seconds (580 allocations: 771.606 MiB, 3.07% gc time) + # 0.117933 seconds (468 allocations: 535.131 MiB, 0.43% gc time) @time reg(df, @formula(y ~ x1 + x2), Vcov.cluster(:id1, :id2)) - #0.765847 seconds (719 allocations: 1.128 GiB, 2.01% gc time) + # 0.384734 seconds (641 allocations: 849.876 MiB, 13.68% gc time) ```` - fixest v0.8.4 (R 4.2.2) + fixest v0.13.2 (R 4.4.2) ```R library(fixest) N = 10000000 @@ -41,23 +42,23 @@ Code to reproduce this graph: df[, "y"] = 3 * df[, "x1"] + 2 * df[, "x2"] + sin(as.numeric(df[, "id1"])) + cos(as.numeric(df[, "id2"])) + runif(N) system.time(feols(y ~ x1 + x2, df)) #> user system elapsed - #> 0.280 0.036 0.317 + #> 0.324 0.028 0.354 system.time(feols(y ~ x1 + x2|id1, df)) #> user system elapsed - #> 0.616 0.089 0.704 + #> 0.396 0.048 0.444 system.time(feols(y ~ x1 + x2|id1 + id2, df)) #> user system elapsed - #> 1.181 0.120 1.297 + #> 0.714 0.056 0.770 system.time(feols(y ~ x1 + x2, cluster = "id1", df)) #> user system elapsed - #> 0.630 0.071 0.700 + #> 0.438 0.046 0.498 system.time(feols(y ~ x1 + x2, cluster = c("id1", "id2"), df)) #> user system elapsed - #> 1.570 0.197 1.803 + #> 1.345 0.102 1.449 ``` - lfe v2.8-8 (R 4.2.2) + lfe v3.1.1 (R 4.4.2) ```R library(lfe) N = 10000000 @@ -72,22 +73,23 @@ Code to reproduce this graph: system.time(felm(y ~ x1 + x2, df)) #> user system elapsed - #> 1.137 0.232 1.596 + #> 0.807 0.107 0.914 system.time(felm(y ~ x1 + x2|id1, df)) #> user system elapsed - #> 7.08 0.41 7.46 + #> 5.589 0.202 5.770 system.time(felm(y ~ x1 + x2|id1 + id2, df)) #> user system elapsed - #> 4.832 0.370 4.615 + #> 3.580 0.300 3.504 system.time(felm(y ~ x1 + x2|0|0|id1, df)) #> user system elapsed - #> 3.712 0.287 3.996 + #> 3.105 0.166 3.271 system.time(felm(y ~ x1 + x2|0|0|id1 + id2, df)) #> user system elapsed - #> 59.119 0.889 59.946 + #> 48.771 0.552 49.466 + ``` - reghdfe version 5.6.8 03mar2019 (Stata 16.1) + reghdfe 5.7.3 / ivreg2 4.1.11 (Stata 19.0 MP, 2 cores) ``` clear all local N = 10000000 @@ -102,13 +104,13 @@ Code to reproduce this graph: set rmsg on reg y x1 x2 - #> r; t=0.61 + #> r; t=0.46 reghdfe y x1 x2, a(id1) - #>r; t=4.64 + #> r; t=2.67 reghdfe y x1 x2, a(id1 id2) - #> r; t==22.99 + #> r; t=15.14 reg y x1 x2, cl(id1) - #> r; t=8.28 + #> r; t=6.44 ivreg2 y x1 x2, cluster(id1 id2) - #> r; t=70.44 + #> r; t=35.71 ```` diff --git a/benchmark/fixedeffectmodels_benchmark.png b/benchmark/fixedeffectmodels_benchmark.png index b79ebed1d7c34edd47cd81c7e53a2f85a013abdf..90237c76f6a082c1f6f97c7e262f19f5602d424b 100644 GIT binary patch literal 57650 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

mEdGN)(g3TxevByYf54hvE4x|Z33^~zI`m0 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 WgUt8ejV!nPj*v@M7xCvk?))EoWd7Lz diff --git a/benchmark/result.jl b/benchmark/result.jl index bebb8a44..62a61804 100644 --- a/benchmark/result.jl +++ b/benchmark/result.jl @@ -1 +1,21 @@ -using DataFrames, CSV, StatsPlots df = CSV.read("/Users/matthieugomez/Dropbox/Github/FixedEffectModels.jl/benchmark/benchmark2.csv", DataFrame) df."fixest (R)" = df."fixest (R)" ./ df."FixedEffectModels.jl (Julia)" df."lfe (R)" = df."lfe (R)" ./ df."FixedEffectModels.jl (Julia)" df."reg / reghdfe (Stata)" = df."reg / reghdfe (Stata)" ./ df."FixedEffectModels.jl (Julia)" df."FixedEffectModels.jl (Julia)" = df."FixedEffectModels.jl (Julia)" ./ df."FixedEffectModels.jl (Julia)" mdf = stack(df, Not([:Command, :Order])) mdf = rename(mdf, :variable => :Language) p = @df mdf plot( :Command, :value, group = :Language, yaxis = :log10, xlabel = "Command", ylabel = "Time (Ratio to Julia)", legend = :top, seriestype = :scatter, # or :line / :path depending on what you want palette = :tol_light, dpi = 200, size=(8 * 100 * 2 /3, 5 * 100 * 2 /3) ) savefig("/Users/matthieugomez/Dropbox/Github/FixedEffectModels.jl/benchmark/fixedeffectmodels_benchmark.png") \ No newline at end of file +using DataFrames, CSV, StatsPlots +df = CSV.read(joinpath(@__DIR__, "benchmark.csv"), DataFrame) +df."fixest (R)" = df."fixest (R)" ./ df."FixedEffectModels.jl (Julia)" +df."lfe (R)" = df."lfe (R)" ./ df."FixedEffectModels.jl (Julia)" +df."reg / reghdfe (Stata)" = df."reg / reghdfe (Stata)" ./ df."FixedEffectModels.jl (Julia)" +df."FixedEffectModels.jl (Julia)" = df."FixedEffectModels.jl (Julia)" ./ df."FixedEffectModels.jl (Julia)" +mdf = stack(df, Not([:Command, :Order])) +mdf = rename(mdf, :variable => :Language) +p = @df mdf plot( + :Command, :value, + group = :Language, + yaxis = :log10, + xlabel = "Command", + ylabel = "Time (Ratio to Julia)", + legend = :top, + seriestype = :scatter, + palette = :tol_light, + dpi = 200, + right_margin = 8Plots.mm, + size = (8 * 100 * 2 / 3, 5 * 100 * 2 / 3)) +savefig(joinpath(@__DIR__, "fixedeffectmodels_benchmark.png"))