███████ ██████ ██████ ██████ ██████ ██ ██ ████████ ██ ██ ██████ ███ ██
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██
███████ ██ ██████ ██ █████ ██████ ████ ██ ███████ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
███████ ██████ ██ ██████ ██ ██ ██ ██ ██ ██████ ██ ████
scpc-python: Spatial Correlation-Robust Inference
scpc-python provides spatial correlation-robust inference for regression
coefficients following Müller and Watson (2022, 2023).
Installation
You can install scpc-python from PyPI (coming soon) with:
uv venv --python 3.11
uv pip install scpc-python
or from GitHub with:
uv venv --python 3.11
uv pip install git+https://github.com/DGoettlich/scpc-python.git
Basic Usage
This example starts from the transformed branch of the Becker, Boll, and Voth (2026)
workflow. In the full workflow, you would first use spurtest to decide
whether to stay in levels or transform. Here we assume the transformed branch
and move directly to the regression plus scpc step.
# assumes spur-python is installed
from spur import load_chetty_data, spurtransform
from scpc import scpc
import statsmodels.formula.api as smf
data = load_chetty_data()
data = data[~data["state"].isin(["AK", "HI"])][
["am", "gini", "fracblack", "lat", "lon"]
]
data = data.dropna(subset=["am", "gini", "fracblack", "lat", "lon"]).copy()
transformed = spurtransform(
"am ~ gini + fracblack",
data,
lon="lon",
lat="lat",
transformation="lbmgls",
prefix="h_",
)
fit = smf.ols("h_am ~ h_gini + h_fracblack", data=transformed).fit()
result = scpc(
fit,
data=transformed,
lon="lon",
lat="lat",
cvs=True,
)
print(result)
scpc() returns an SCPCResult object:
print(result): prints an R-like SCPC inference tableresult.scpcstats: the main inference table with coefficient estimates, standard errors, t statistics, p values, and 95% interval endpointsresult.scpccvs: optional stored critical values at 32%, 10%, 5%, and 1%result.coef(): returns named coefficient estimates inscpc-python>=0.1.2result.confint(): returns named confidence intervals inscpc-python>=0.1.2result.summary(): prints the main table plus confidence intervals inscpc-python>=0.1.2result.avc: the average pairwise correlation bound used in the analysisresult.c0: the kernel scale implied byavcresult.cv: the unconditional 5% critical valueresult.q: the number of retained non-constant spatial principal components
Key Arguments
The most important scpc() arguments in the workflow above are:
model: the fitted regression modeldata: the data framelon,lat: the geodesic coordinate column namescoords_euclidean: use this instead oflon/latwhen coordinates are Euclidean rather than geographiccluster: optional clustering columnncoef: how many coefficients to reportavc: upper bound on the average pairwise correlationuncond: whether to skip the conditional adjustmentcvs: whether to store the extra critical values
Release files for scpc-python 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| scpc_python-0.1.2.tar.gz | 42.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| scpc_python-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 68.5 kB
Release files / scpc_python-0.1.2.tar.gz
| Download URL | scpc_python-0.1.2.tar.gz |
|---|---|
| Size | 42.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
031d59006eb2cae0ebce9068b11fc30403a7f284107015fadf11743692a2a142
|
|
BLAKE2b-256 checksum How to use checksums |
6c2f4ef7e49f1f0a8888f4efff274a023fe8a6783385f8894a14fc80f893bb58
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 23, 2026.
Transparency logRelease files / scpc_python-0.1.2-py3-none-any.whl
| Download URL | scpc_python-0.1.2-py3-none-any.whl |
|---|---|
| Size | 26.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
be715bdf7bf6dae2eca84b4a1fa92dd38578090f8ee667457e5bb085a346bc38
|
|
BLAKE2b-256 checksum How to use checksums |
dd5b4c86a10f9ca9d8cea149cac05ed6fa3d6662b70c192210d31ae126f66881
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 23, 2026.
Transparency log