SOFM
Spatially orthogonal factor models
Installation
Please install scikit-sparse via conda before installing this package:
conda install -c conda-forge scikit-sparse
pip install sofm
Data
Please use the spatialLIBD_to_netcdf.R script to download the DLPFC data from R and save as a netcdf file to be imported into xarray.
Code example
from sofm import SOFM
# 1. Load netcdf into xarray
# Please see `spatialLIBD_to_netcdf.R` for directions on formatting the netcdf file.
da = xr.open_dataset("/data_directory/spatial_transcriptomic_data.nc", engine='netcdf4')['logcounts']
da = da - da.mean(dim='spot') #SOFM assumes the mean structure has been subtracted
da = da.rename({ #SOFM assumes `da` has `location` dimension indexed by `lat,lon` coordinates
'spot': 'location',
'array_col': 'lon',
'array_row': 'lat'
})
da = da.set_index(location=['lat', 'lon'])
# 2. Initialize SOFM model
sofm_model = SOFM(
data=da,
n_components=5,
n_cores=-1 #please set number of cores
)
# 3. Fit model
sofm_model.fit()
# 4. Visualize spatial loadings
fig = sofm_model.plot_loadings(robust=True)
fig.show()
# 5. Analyze latent factors
latent_factors = sofm_model.Ez_
If helpful, try out the code using a synthetic dataset,
import numpy as np
import xarray as xr
from sofm import SOFM
# 1. Generate Synthetic Data
# Create a 30x30 spatial grid
lats, lons = np.meshgrid(np.linspace(-5, 5, 30), np.linspace(-5, 5, 30))
lat_flat = lats.flatten()
lon_flat = lons.flatten()
n_locations = len(lat_flat)
n_features = 20
factor1 = np.sin(lat_flat) + np.cos(lon_flat)
factor2 = np.exp(-(lat_flat**2 + lon_flat**2) / 2)
factor3 = lat_flat + lon_flat
Z = np.column_stack([factor1, factor2, factor3])
np.random.seed(42)
W = np.random.randn(3, n_features) # Synthetic loadings
data_matrix = Z @ W + np.random.randn(n_locations, n_features) * 0.5
da = xr.DataArray(
data_matrix,
dims=['location', 'feature'],
coords={
'lat': ('location', lat_flat),
'lon': ('location', lon_flat),
'feature': np.arange(n_features)
}
)
da = da.set_index(location=['lat', 'lon'])
da = da - da.mean(dim='location')
# 2. Initialize SOFM model
sofm_model = SOFM(
data=da,
n_components=3,
n_cores=-1 #please set number of cores
)
# 3. Fit model
sofm_model.fit()
# 4. Visualize spatial loadings
fig = sofm_model.plot_loadings(robust=True)
fig.show()
# 5. Analyze latent factors
latent_factors = sofm_model.Ez_
Release files for sofm 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sofm-0.1.4.tar.gz | 19.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sofm-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 39.5 kB
Release files / sofm-0.1.4.tar.gz
| Download URL | sofm-0.1.4.tar.gz |
|---|---|
| Size | 19.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4079f5f0551a0a0b3a59bb7fb84ea62de35208e0779d84a65e4a94be64b7d950
|
|
BLAKE2b-256 checksum How to use checksums |
bb8c2e5006686d9b067b596ba06de594126393168c48ed5a5ad9f26842785845
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|
Release files / sofm-0.1.4-py3-none-any.whl
| Download URL | sofm-0.1.4-py3-none-any.whl |
|---|---|
| Size | 20.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
07d3511bb8e9f35bcab11db5f602fbedaed5ad12eae427fd235d9e2f24bf8795
|
|
BLAKE2b-256 checksum How to use checksums |
c34e66db4b74731ea866a7da336bd8f7e29fccb139b0e2bc3f6fb7f58cc0c56f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|