[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DTNF4HP2WP971HD2QZ8TG8":3,"skill-same:01M6DTNF4HP2WP971HD2QZ8TG8":106},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":43,"ownerHtmlUrl":44,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":45,"install":46,"resources":59},"01M6DTNF4HP2WP971HD2QZ8TG8","spatial-register",null,"Load when aligning multiple spatial slices into a common coordinate frame with PASTE or STalign. Skip single-slice data; for expression-space batch correction use spatial-integrate.","TianGzlab\u002FOmicsClaw","TianGzlab","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F150978281?v=4","01M6DT9WNJJ470ADHPSMFAA02Y","01M6DT9WSN09C5K65GB6RK18R9",161,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29],"Spatial","register","spatial register","batch","data","common","use","integrate","alignment","registration","coordinate","expression","2026-11-10 10:12:30",false,"---\nname: spatial-register\ndescription: Load when aligning multiple spatial slices into a common coordinate frame with PASTE or STalign. Skip single-slice data; for expression-space batch correction use spatial-integrate.\ntrigger: spatial registration, slice alignment, PASTE, STalign\ntags:\n- spatial\n- registration\n- alignment\n---\n\n# spatial-register\n\n## Use from a step\n\n```python\nfrom skills._sdk.notebook import load_skill, read_input, write_output\nlibrary = load_skill(\"spatial-register\")\nadata = library.register(read_input(\"data\u002Fslices.h5ad\"), slice_key=\"slice\")\nwrite_output(adata, \"intermediate\u002Fregistered.h5ad\")\n```\n\n## When to use\n\nAlign slice coordinates while preserving the original spatial coordinates.\nPASTE uses expression and spatial distances; STalign supports two slices.\nFor expression-space correction use spatial-integrate instead.\n\n## Inputs & Outputs\n\nInput: AnnData with expression, spatial coordinates and a slice-label column.\nThe default reference is the first sorted label, not the largest slice.\nFunctions return the same AnnData, shift tables and figures without writing files.\n\nCLI writes `processed.h5ad`, `report.md`, `result.json`, registration tables\nand the before\u002Fafter gallery. See [references\u002Foutput_contract.md](references\u002Foutput_contract.md)\nfor the complete file inventory. Registered coordinates are `obsm[\"spatial_aligned\"]`;\n`spatial` and `X_spatial`, if present, remain unchanged.\n\n## Key CLI\n\n```bash\npython skills\u002Fspatial\u002Fspatial-register\u002Fspatial_register.py --input slices.h5ad --output results\u002Fregistration --slice-key slice --method paste\npython skills\u002Fspatial\u002Fspatial-register\u002Fspatial_register.py --demo --output \u002Ftmp\u002Fspatial_register\n```\n\n`examples\u002Fexample_step.py` aligns unequal-size simulated slices through the\nstep runner. [references\u002Fparameters.md](references\u002Fparameters.md) lists backend flags.\n\n## Gotchas\n\n- `spatial_aligned` is a separate coordinate basis; downstream skills do not\n  automatically switch from `spatial`.\n- PASTE transports source spots with the transpose of its reference-by-source\n  coupling. The old `_lib\u002Fregister.py:run_paste` direction was incorrect;\n  unequal slice sizes now work, and solver failures raise instead of reporting success.\n- The historical `disparities` summary is sum of squared transport weights,\n  not the optimal-transport objective or a calibrated fit statistic.\n- The tested PASTE 1.4.0 combination needs POT 0.9.4. POT 0.9.5 and 0.9.6 changed\n  the line-search call and fail inside PASTE. Use an isolated compatible environment.\n- STalign is optional and was not executed in this migration environment.\n  It has no exposed seed control here; do not claim deterministic GPU results.\n- `tables\u002Fregistration_metrics.csv` has NaN disparity where the backend\n  does not report it. Inspect shifts without treating smaller displacement as better alignment.\n\n## API\n\n\u003C!-- api:begin generated from _api.py; regenerate with run.py api \u003Cskill dir> --write -->\n\n### `register(adata, *, method: str='paste', slice_key: str | None=None, reference_slice: str | None=None, **parameters)`\n\nAdd aligned coordinates in place without overwriting the input coordinates.\n\n:param adata: AnnData with expression, spatial coordinates and slice labels.\n:param method: paste (default) for transport or stalign for two-slice LDDMM.\n:param slice_key: Observation column; None detects slice, sample, section or batch.\n:param reference_slice: Target label; None uses the first sorted label.\n:param parameters: PASTE alpha=0.1, dissimilarity='kl', use_gpu=False;\n    STalign image_size=(400,400), niter=2000, a=500, use_expression=False.\n    PASTE is deterministic on CPU; STalign has no seed control and may vary.\n:returns: The same AnnData with spatial_aligned and JSON run diagnostics.\n:raises ValueError: Invalid labels, coordinates, method or method parameters.\n:raises ImportError: Missing backend; use install_skill_deps for paste-bio\u002FPOT\n    or STalign\u002Ftorch as appropriate.\n:raises RuntimeError: A slice cannot be aligned; partial success is not returned.\n\n### `run_info(adata, *, keep: bool=True) -> dict`\n\nRead the last registration summary.\n\n:param adata: Registered AnnData.\n:param keep: True retains diagnostics; False removes them for CLI serialization.\n:returns: Summary with reference, slices and effective parameters, or an empty dict.\n\n### `shift_table(adata) -> pd.DataFrame`\n\nMeasure Euclidean displacement from original to registered coordinates.\n\n:param adata: AnnData with spatial_aligned and original spatial coordinates.\n:returns: observation and shift_distance columns, in observation order.\n:raises KeyError: Aligned coordinates are absent.\n:raises ValueError: Original coordinates are absent.\n\n### `registration_figure(adata, *, slice_key: str | None=None)`\n\nPlot original and registered slice coordinates side by side.\n\n:param adata: Registered AnnData.\n:param slice_key: Slice label column; None detects the column from the data.\n:returns: A matplotlib Figure; the caller saves and closes it.\n:raises KeyError: Aligned coordinates or labels are absent.\n\n\u003C!-- api:end -->\n\n## Dependencies\n\n`anndata`, `matplotlib`, `numpy`, `pandas`, `paste-bio`, `POT`, `scanpy`, `scikit-learn`, `scipy`, `seaborn`, `STalign`, `torch`\n\nThe CLI dependency list covers both methods; install only the chosen backend.\n","# spatial-register\n\n## Use from a step\n\n```python\nfrom skills._sdk.notebook import load_skill, read_input, write_output\nlibrary = load_skill(\"spatial-register\")\nadata = library.register(read_input(\"data\u002Fslices.h5ad\"), slice_key=\"slice\")\nwrite_output(adata, \"intermediate\u002Fregistered.h5ad\")\n```\n\n## When to use\n\nAlign slice coordinates while preserving the original spatial coordinates.\nPASTE uses expression and spatial distances; STalign supports two slices.\nFor expression-space correction use spatial-integrate instead.\n\n## Inputs & Outputs\n\nInput: AnnData with expression, spatial coordinates and a slice-label column.\nThe default reference is the first sorted label, not the largest slice.\nFunctions return the same AnnData, shift tables and figures without writing files.\n\nCLI writes `processed.h5ad`, `report.md`, `result.json`, registration tables\nand the before\u002Fafter gallery. See [references\u002Foutput_contract.md](references\u002Foutput_contract.md)\nfor the complete file inventory. Registered coordinates are `obsm[\"spatial_aligned\"]`;\n`spatial` and `X_spatial`, if present, remain unchanged.\n\n## Key CLI\n\n```bash\npython skills\u002Fspatial\u002Fspatial-register\u002Fspatial_register.py --input slices.h5ad --output results\u002Fregistration --slice-key slice --method paste\npython skills\u002Fspatial\u002Fspatial-register\u002Fspatial_register.py --demo --output \u002Ftmp\u002Fspatial_register\n```\n\n`examples\u002Fexample_step.py` aligns unequal-size simulated slices through the\nstep runner. [references\u002Fparameters.md](references\u002Fparameters.md) lists backend flags.\n\n## Gotchas\n\n- `spatial_aligned` is a separate coordinate basis; downstream skills do not\n  automatically switch from `spatial`.\n- PASTE transports source spots with the transpose of its reference-by-source\n  coupling. The old `_lib\u002Fregister.py:run_paste` direction was incorrect;\n  unequal slice sizes now work, and solver failures raise instead of reporting success.\n- The historical `disparities` summary is sum of squared transport weights,\n  not the optimal-transport objective or a calibrated fit statistic.\n- The tested PASTE 1.4.0 combination needs POT 0.9.4. POT 0.9.5 and 0.9.6 changed\n  the line-search call and fail inside PASTE. Use an isolated compatible environment.\n- STalign is optional and was not executed in this migration environment.\n  It has no exposed seed control here; do not claim deterministic GPU results.\n- `tables\u002Fregistration_metrics.csv` has NaN disparity where the backend\n  does not report it. Inspect shifts without treating smaller displacement as better alignment.\n\n## API\n\n\u003C!-- api:begin generated from _api.py; regenerate with run.py api \u003Cskill dir> --write -->\n\n### `register(adata, *, method: str='paste', slice_key: str | None=None, reference_slice: str | None=None, **parameters)`\n\nAdd aligned coordinates in place without overwriting the input coordinates.\n\n:param adata: AnnData with expression, spatial coordinates and slice labels.\n:param method: paste (default) for transport or stalign for two-slice LDDMM.\n:param slice_key: Observation column; None detects slice, sample, section or batch.\n:param reference_slice: Target label; None uses the first sorted label.\n:param parameters: PASTE alpha=0.1, dissimilarity='kl', use_gpu=False;\n    STalign image_size=(400,400), niter=2000, a=500, use_expression=False.\n    PASTE is deterministic on CPU; STalign has no seed control and may vary.\n:returns: The same AnnData with spatial_aligned and JSON run diagnostics.\n:raises ValueError: Invalid labels, coordinates, method or method parameters.\n:raises ImportError: Missing backend; use install_skill_deps for paste-bio\u002FPOT\n    or STalign\u002Ftorch as appropriate.\n:raises RuntimeError: A slice cannot be aligned; partial success is not returned.\n\n### `run_info(adata, *, keep: bool=True) -> dict`\n\nRead the last registration summary.\n\n:param adata: Registered AnnData.\n:param keep: True retains diagnostics; False removes them for CLI serialization.\n:returns: Summary with reference, slices and effective parameters, or an empty dict.\n\n### `shift_table(adata) -> pd.DataFrame`\n\nMeasure Euclidean displacement from original to registered coordinates.\n\n:param adata: AnnData with spatial_aligned and original spatial coordinates.\n:returns: observation and shift_distance columns, in observation order.\n:raises KeyError: Aligned coordinates are absent.\n:raises ValueError: Original coordinates are absent.\n\n### `registration_figure(adata, *, slice_key: str | None=None)`\n\nPlot original and registered slice coordinates side by side.\n\n:param adata: Registered AnnData.\n:param slice_key: Slice label column; None detects the column from the data.\n:returns: A matplotlib Figure; the caller saves and closes it.\n:raises KeyError: Aligned coordinates or labels are absent.\n\n\u003C!-- api:end -->\n\n## Dependencies\n\n`anndata`, `matplotlib`, `numpy`, `pandas`, `paste-bio`, `POT`, `scanpy`, `scikit-learn`, `scipy`, `seaborn`, `STalign`, `torch`\n\nThe CLI dependency list covers both methods; install only the chosen backend.\n",{"name":5,"tags":35,"trigger":37,"description":7},[36,27,26],"spatial","spatial registration, slice alignment, PASTE, STalign","main","90a3bec3e6549bc33dddbf67e4b23869736c49d1","skills\u002Fspatial\u002Fspatial-register",27,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw","https:\u002F\u002FTianGzlab.github.io\u002FOmicsClaw\u002F","https:\u002F\u002Fgithub.com\u002FTianGzlab","2026-10-08 01:36:11",{"source":8,"skillName":5,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add TianGzlab\u002FOmicsClaw --skill spatial-register",{"tool":52,"command":53},"bunx","bunx skills add TianGzlab\u002FOmicsClaw --skill spatial-register",{"tool":55,"command":56},"pnpm","pnpm dlx skills add TianGzlab\u002FOmicsClaw --skill spatial-register","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002FSKILL.md",true,[60,66,70,76,82,86,90,94,98,102],{"path":61,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":65},"_api.py","SCRIPT","脚本",5858,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002F_api.py",{"path":67,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":68,"sourceHtmlUrl":69},"examples\u002Fexample_step.py",1090,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002Fexamples\u002Fexample_step.py",{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"r_visualization\u002FREADME.md","REFERENCE","参考文档",1605,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002Fr_visualization\u002FREADME.md",{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"r_visualization\u002Fregister_publication_template.R","OTHER","其他",4730,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002Fr_visualization\u002Fregister_publication_template.R",{"path":83,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002Fmethodology.md",6959,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002Freferences\u002Fmethodology.md",{"path":87,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":88,"sourceHtmlUrl":89},"references\u002Foutput_contract.md",1747,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002Freferences\u002Foutput_contract.md",{"path":91,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":92,"sourceHtmlUrl":93},"references\u002Fparameters.md",2069,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002Freferences\u002Fparameters.md",{"path":95,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":96,"sourceHtmlUrl":97},"spatial_register.py",40258,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002Fspatial_register.py",{"path":99,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":100,"sourceHtmlUrl":101},"tests\u002Ftest_api.py",4143,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002Ftests\u002Ftest_api.py",{"path":103,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":104,"sourceHtmlUrl":105},"tests\u002Ftest_spatial_register.py",14240,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-register\u002Ftests\u002Ftest_spatial_register.py",[107,125,137,154,179,201],{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":118,"publishedAt":30},"01M6DTP4X225Q92RMY8XXHPCTT","demo-skill","A fixture skill for the skill environment tests. Use it for nothing else.","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Ftests\u002Fskillenv\u002Ffixtures\u002Fskills\u002Fdemo\u002Fdemo-skill\u002FSKILL.md",[113],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[119,120,121,122,123,24,124],"demo skill","demo","tests","fixture","fixture skill","environment",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":30},"01M6DTP28JTWQK3HHXDNQV8BBV","fake-domains","Test fixture for the golden deployment in tests\u002Fentry. Load never; it has no script.","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Ftests\u002Fentry\u002Ffake_skills\u002Fspatial\u002Ffake-domains\u002FSKILL.md",[],[132,133,134,121,122,135,136],"domains","fake domains","deployment","never","test",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":144,"publishedAt":30},"01M6DTNZ4AMWKTME1T18K5C643","replace-me-skill","Load when copying this directory to bootstrap a new OmicsClaw skill. Skip when an existing skill already covers the request.","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Ftemplates\u002Fskill\u002FSKILL.md",[143],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},[145,146,147,148,149,150,151,152,153],"me","replace me skill","template","directory","skill template","existing skill","new skill","bootstrap","scaffold",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":30},"01M6DTNV63MTD0Q6YRC52F0B1Y","spatial-velocity","Load when estimating RNA velocity on a spatial AnnData with `layers[\"spliced\"]` + `layers[\"unspliced\"]` via scVelo (stochastic \u002F deterministic \u002F dynamical) or veloVI (deep generative). Skip when input lacks the spliced\u002Funspliced layers (must be quantified upstream by velocyto \u002F kb-python \u002F STARsolo); non-spatial scRNA velocity (use sc-velocity).","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-velocity\u002FSKILL.md",[],[161,162,18,163,164,165,166,167,168,169,170,171,172,173,174,175,176,24,177,178],"velocity","spatial velocity","scvelo","input","starsolo","time","deep","RNA","kb-python","via","velocyto","rna-velocity","velovi","dynamics","upstream","kb","python","deterministic",{"skillNo":180,"name":181,"nameZh":6,"description":182,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":183,"categories":184,"keywords":185,"publishedAt":30},"01M6DTNPMR227NAT8QFY620YDW","spatial-trajectory","Load when inferring pseudotime \u002F lineage trajectories on a preprocessed spatial AnnData via DPT (default — diffusion pseudotime), CellRank (terminal-state + fate-probability), or Palantir (waypoint branch probabilities). Skip when the data has spliced\u002Funspliced layers and you want velocity-driven dynamics (use spatial-velocity); non-spatial scRNA pseudotime (use sc-pseudotime).","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-trajectory\u002FSKILL.md",[],[18,186,187,188,189,190,191,192,170,193,194,195,196,197,161,198,24,199,200,22],"trajectory","spatial trajectory","state","terminal","lineage","diffusion","cellrank","palantir","dpt","pseudotime","probability","cell","default","branch","anndata",{"skillNo":202,"name":203,"nameZh":6,"description":204,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":205,"categories":206,"keywords":207,"publishedAt":30},"01M6DTNJEYFT33P84DGHDNXW95","spatial-statistics","Load when running spatial autocorrelation \u002F hotspot \u002F co-occurrence \u002F neighbourhood-enrichment \u002F Ripley K stats on a clustered spatial AnnData via squidpy. Skip when ranking spatially variable genes (use spatial-genes); tissue domain detection (use spatial-domains).","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-statistics\u002FSKILL.md",[],[208,209,18,170,210,211,212,213,214,215,132,216,217,218,219,24,200,220,221,222],"spatial statistics","statistics","nhood-enrichment","co-occurrence","ripley","geary","moran","neighbourhood","ranking","autocorrelation","local","domain","detection","enrichment","stats"]