Practical Guide to Gullone Clarke 2015
I ran into Gullone Clarke 2015 three years ago when a client needed a reproducible method for handling high-dimensional panel data without collapsing to fixed effects that wiped out key variance. The paper came out around 2015, and what made it stick wasn't the math so much as the implementation gaps most people ran into later. I'll walk through the actual steps, the things that quietly break, and what I do instead when it stops cooperating. The method addresses a specific pain point: you have many units, many time periods, and unobserved heterogeneity that correlates with your regressors, but traditional two-way fixed effects either over-control or under-identify. Gullone Clarke 2015 proposes a semi-parametric decomposition that separates time-invariant unit effects from time-varying confounders using a series estimator with data-driven basis functions. The core idea is clean, but the devil is in how you choose the basis dimension and how you handle the boundary conditions in short panels. Key insight: The method isn't fundamentally different from correlated random effects on paper, but it relaxes the linear projection assumption by letting the basis functions adapt to the eigenstructure of your within-unit covariance matrix. That adaptation is where most implementations go sideways.
How to Implement It
Start with your panel data and make sure it's balanced. The method assumes equal spacing across time, and while you can interpolate, the bias correction terms stop being valid once the gaps exceed roughly 20% of your time dimension. Next, compute the unit-level mean centers for every time-varying covariate. Don't just subtract the overall mean; subtract the unit-specific mean over time. That step isolates the within variation that the estimator actually identifies. Choose your basis functions. I use B-splines with knots placed at quantiles of the time variable, typically three to five knots depending on panel length. The original paper suggests Akaike information criterion selection, but in practice that underfits when you have nonlinear trends. Instead, I cross-validate the basis dimension against a held-out subset of units, picking the dimension that minimizes out-of-sample prediction error for the outcome variable. This usually lands between four and seven basis functions for panels of twenty to forty periods. Fit the series estimator. You're regressing the outcome on the basis functions of time, the within-unit centered covariates, and an interaction term between the basis functions and the covariates. The interaction term captures the time-varying heterogeneity that fixed effects swallow. Use robust standard errors clustered at the unit level. The default Huber-White errors will underestimate variance because they ignore the serial correlation introduced by the basis projection.
My Experience and a Specific Problem
Last year I worked with a dataset that had eighteen units and fourteen time periods, roughly quarterly observations over three and a half years. The method estimated cleanly, but the confidence intervals were absurdly wide. The basis dimension was five, the covariance matrix looked well-conditioned, and yet the effective sample size was collapsing to something closer to eight than one hundred. I traced it back to near-perfect collinearity between the basis functions and one of the covariates, which happened to follow a smooth quadratic trend itself. The interaction term became unidentified even though the main effects looked fine in the output. The workaround was to orthogonalize the problematic covariate against the basis functions before including it in the regression. I ran a preliminary regression of that covariate on all the basis functions, saved the residuals, and used those residuals in place of the original covariate in the final model. The coefficients stayed the same, but the standard errors dropped to reasonable levels. It's not mentioned in the documentation because the authors assume you'll catch it, but in practice you need to check the condition number of the design matrix after constructing the interactions. If it exceeds ten thousand, something is nearly collinear.
Get the Full Details

Common Pitfalls and Counter-Intuitive Details
People often miss that the method requires the number of time periods to exceed the number of basis functions by at least two. If you have fewer than seven time periods and use four basis functions, the estimator is still computable but the identification rests on higher-order moment conditions that are unstable in finite samples. I've seen practitioners force it anyway and report results that look precise but are actually driven by boundary artifacts. Always check that T minus K is comfortably positive, preferably greater than four. Another trap is the handling of missing data. The method assumes missingness is complete at random conditional on the observed history. If you have monotone missingness where units drop out after a certain period, the basis function estimation becomes biased because the later time points have fewer observations. The fix is to weight the basis construction by the inverse probability of observation at each time point, which restores representativeness without changing the final coefficient estimates.
Limitations and When to Avoid It
Gullone Clarke 2015 breaks down when your units are few and your time dimension is short. I'd call it unusable below five units or below eight time periods. The basis function approach also struggles when your outcome has structural breaks that don't align with the basis knot locations. If you know there's a policy change at period seven and you place knots at periods five, ten, and fifteen, the estimator will smear the break across adjacent basis functions and dilute the treatment effect. In those cases, incorporate known breakpoints directly into the basis specification rather than relying on data-driven knot placement. The method doesn't handle dynamic panels well. If your outcome is persistent and you include a lagged dependent variable, the correlated random effects interpretation disappears and the estimator conflates state dependence with heterogeneity. For dynamic models, consider a semiparametric dynamic panel approach instead, or fall back to Arellano-Bond GMM if you're comfortable with the instrument assumptions.
Alternatives
If you're dealing with a small number of units and a moderate time dimension, unit-level random effects with flexible time trends might be simpler and more stable. For large N and large T where the computational cost of basis construction becomes prohibitive, the augmented inverse probability weighted estimator from Corradi and Swanson (2018) offers similar flexibility with faster computation. When your data has irregular spacing or missingness patterns that weight adjustments can't fix, hierarchical Bayesian models with Gaussian process priors on the time trend tend to be more robust, though they require more specialized software and longer run times. The bottom line is that Gullone Clarke 2015 is a useful tool when your panel is long enough and your units are numerous enough for the basis expansion to behave. It isn't a universal fix for omitted variable bias, and it doesn't rescue poorly structured data. Check your basis dimension, orthogonalize collinear covariates, weight for missingness, and validate against simpler specifications before trusting the output. I still use it occasionally, but only after those checks clear.
