spatialquery.js 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ export type FrequentPattern = {
2
+ itemsets: string[];
3
+ support: number;
4
+ neighborIds?: string[];
5
+ };
6
+ export declare function findMaximalPatterns<T extends {
7
+ itemsets: string[];
8
+ }>(patterns: T[]): T[];
9
+ export declare function mineFrequentPatterns(transactions: string[][], minSupport: number, ifMax: boolean): Promise<FrequentPattern[]>;
10
+ //# sourceMappingURL=fpgrowth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fpgrowth.d.ts","sourceRoot":"","sources":["../src/fpgrowth.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG;IAE5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAIF,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAOxF;AAMD,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EAAE,EAAE,EACxB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,eAAe,EAAE,CAAC,CAyB5B"}
@@ -0,0 +1,35 @@
1
+ import { FPGrowth } from 'node-fpgrowth';
2
+ // Keep only the maximal patterns: those that are not a proper subset of another pattern.
3
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_utils.py#L68
4
+ export function findMaximalPatterns(patterns) {
5
+ const sets = patterns.map(p => new Set(p.itemsets));
6
+ return patterns.filter((p, i) => !sets.some((other, j) => (j !== i
7
+ && other.size > sets[i].size
8
+ && p.itemsets.every(item => other.has(item)))));
9
+ }
10
+ // Mine frequent patterns from transactions of cell type labels.
11
+ // Equivalent to the MultiLabelBinarizer + mlxtend fpgrowth + find_maximal_patterns
12
+ // steps of build_fptree_dist / build_fptree_knn.
13
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_utils.py#L454
14
+ export async function mineFrequentPatterns(transactions, minSupport, ifMax) {
15
+ if (transactions.length === 0) {
16
+ return [];
17
+ }
18
+ // Transactions are binarized in Python, so duplicate cell types are collapsed.
19
+ const uniqueTransactions = transactions.map(t => Array.from(new Set(t)));
20
+ const fpgrowth = new FPGrowth(minSupport);
21
+ const itemsets = await fpgrowth.exec(uniqueTransactions);
22
+ // node-fpgrowth reports support as a count; mlxtend reports a fraction.
23
+ const byKey = new Map();
24
+ for (const { items, support } of itemsets) {
25
+ const sorted = items.toSorted();
26
+ byKey.set(JSON.stringify(sorted), { itemsets: sorted, support: support / transactions.length });
27
+ }
28
+ let patterns = Array.from(byKey.values());
29
+ if (ifMax) {
30
+ patterns = findMaximalPatterns(patterns);
31
+ }
32
+ // Sort by descending support, breaking ties by itemsets for a deterministic order.
33
+ return patterns.toSorted((a, b) => (b.support - a.support || JSON.stringify(a.itemsets).localeCompare(JSON.stringify(b.itemsets))));
34
+ }
35
+ //# sourceMappingURL=fpgrowth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fpgrowth.js","sourceRoot":"","sources":["../src/fpgrowth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAWzC,yFAAyF;AACzF,uGAAuG;AACvG,MAAM,UAAU,mBAAmB,CAAmC,QAAa;IACjF,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxD,CAAC,KAAK,CAAC;WACJ,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;WACzB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAC7C,CAAC,CAAC,CAAC;AACN,CAAC;AAED,gEAAgE;AAChE,mFAAmF;AACnF,iDAAiD;AACjD,wGAAwG;AACxG,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,YAAwB,EACxB,UAAkB,EAClB,KAAc;IAEd,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,+EAA+E;IAC/E,MAAM,kBAAkB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzE,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAS,UAAU,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAEzD,wEAAwE;IACxE,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjD,KAAK,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAChC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1C,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,mFAAmF;IACnF,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACjC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAC9F,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { generateObsIdToObsSetName, normalizeSpatialCoords, buildContext, buildGridPoints, findPatternsGrid, findPatternsRand, findFpKnn, findFpDist, computeMotifEnrichment, motifEnrichmentKnn, motifEnrichmentDist, motifCompositionKnn, motifCompositionDist, type InitParams, type SqContext, type MotifsParam, type EnrichmentMode, type MotifEnrichmentResult, type MotifCompositionRow, } from './single-fov.js';
2
+ export { buildMultiContext, multiFindFpKnn, multiFindFpDist, findFpKnnFov, findFpDistFov, multiMotifEnrichmentKnn, multiMotifEnrichmentDist, multiMotifCompositionKnn, multiMotifCompositionDist, differentialAnalysisKnn, differentialAnalysisDist, differentialTestsKnn, differentialTestsDist, type FovInitParams, type SqMultiContext, type MultiFovMotifEnrichmentResult, type MultiFovMotifCompositionRow, type DifferentialResult, type DifferentialTestResult, } from './multi-fov.js';
3
+ export { findMaximalPatterns, type FrequentPattern } from './fpgrowth.js';
4
+ export { nestedMotifDescent } from './nested.js';
5
+ export { applyFdrCorrection } from './stats.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,EACb,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { generateObsIdToObsSetName, normalizeSpatialCoords, buildContext, buildGridPoints, findPatternsGrid, findPatternsRand, findFpKnn, findFpDist, computeMotifEnrichment, motifEnrichmentKnn, motifEnrichmentDist, motifCompositionKnn, motifCompositionDist, } from './single-fov.js';
2
+ export { buildMultiContext, multiFindFpKnn, multiFindFpDist, findFpKnnFov, findFpDistFov, multiMotifEnrichmentKnn, multiMotifEnrichmentDist, multiMotifCompositionKnn, multiMotifCompositionDist, differentialAnalysisKnn, differentialAnalysisDist, differentialTestsKnn, differentialTestsDist, } from './multi-fov.js';
3
+ export { findMaximalPatterns } from './fpgrowth.js';
4
+ export { nestedMotifDescent } from './nested.js';
5
+ export { applyFdrCorrection } from './stats.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,GAOrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,EACb,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,GAOtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAwB,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,115 @@
1
+ import { type InitParams, type SqContext, type MotifsParam, type MotifEnrichmentResult, type MotifCompositionRow, type EnrichmentMode } from './single-fov.js';
2
+ import { type FrequentPattern } from './fpgrowth.js';
3
+ export type FovInitParams = InitParams & {
4
+ datasetId: string;
5
+ datasetClass: string;
6
+ };
7
+ export type SqMultiContext = {
8
+ datasetIds: string[];
9
+ datasetClasses: string[];
10
+ contexts: SqContext[];
11
+ };
12
+ export declare function buildMultiContext(fovs: FovInitParams[]): SqMultiContext;
13
+ type DatasetClassParam = {
14
+ datasetClass?: string | string[];
15
+ };
16
+ type MultiFindFpKnnParams = DatasetClassParam & {
17
+ ct: string;
18
+ k?: number;
19
+ minSupport?: number;
20
+ maxDist?: number;
21
+ ifMax?: boolean;
22
+ };
23
+ export declare function multiFindFpKnn(multi: SqMultiContext, params: MultiFindFpKnnParams): Promise<FrequentPattern[]>;
24
+ type MultiFindFpDistParams = DatasetClassParam & {
25
+ ct: string;
26
+ maxDist?: number;
27
+ minSize?: number;
28
+ minSupport?: number;
29
+ ifMax?: boolean;
30
+ };
31
+ export declare function multiFindFpDist(multi: SqMultiContext, params: MultiFindFpDistParams): Promise<FrequentPattern[]>;
32
+ type FindFpFovParams = {
33
+ ct: string;
34
+ datasetId: string;
35
+ };
36
+ export declare function findFpKnnFov(multi: SqMultiContext, params: FindFpFovParams & {
37
+ k?: number;
38
+ minSupport?: number;
39
+ maxDist?: number;
40
+ }): Promise<FrequentPattern[]>;
41
+ export declare function findFpDistFov(multi: SqMultiContext, params: FindFpFovParams & {
42
+ maxDist?: number;
43
+ minSize?: number;
44
+ minSupport?: number;
45
+ }): Promise<FrequentPattern[]>;
46
+ export type MultiFovMotifEnrichmentResult = Omit<MotifEnrichmentResult, 'neighborIds' | 'centerIds'> & {
47
+ neighborIds?: Record<string, string[]>;
48
+ centerIds?: Record<string, string[]>;
49
+ };
50
+ type MultiMotifEnrichmentKnnParams = DatasetClassParam & {
51
+ ct: string;
52
+ motifs?: MotifsParam;
53
+ k?: number;
54
+ minSupport?: number;
55
+ maxDist?: number;
56
+ returnCellIds?: boolean;
57
+ mode?: EnrichmentMode;
58
+ };
59
+ export declare function multiMotifEnrichmentKnn(multi: SqMultiContext, params: MultiMotifEnrichmentKnnParams): Promise<MultiFovMotifEnrichmentResult[]>;
60
+ type MultiMotifEnrichmentDistParams = DatasetClassParam & {
61
+ ct: string;
62
+ motifs?: MotifsParam;
63
+ maxDist?: number;
64
+ minSize?: number;
65
+ minSupport?: number;
66
+ returnCellIds?: boolean;
67
+ mode?: EnrichmentMode;
68
+ };
69
+ export declare function multiMotifEnrichmentDist(multi: SqMultiContext, params: MultiMotifEnrichmentDistParams): Promise<MultiFovMotifEnrichmentResult[]>;
70
+ export type MultiFovMotifCompositionRow = MotifCompositionRow & {
71
+ datasetId: string;
72
+ };
73
+ export declare function multiMotifCompositionKnn(multi: SqMultiContext, params: DatasetClassParam & {
74
+ ct: string;
75
+ motifs: MotifsParam;
76
+ k?: number;
77
+ maxDist?: number;
78
+ }): MultiFovMotifCompositionRow[];
79
+ export declare function multiMotifCompositionDist(multi: SqMultiContext, params: DatasetClassParam & {
80
+ ct: string;
81
+ motifs: MotifsParam;
82
+ maxDist?: number;
83
+ }): MultiFovMotifCompositionRow[];
84
+ export type DifferentialTestResult = {
85
+ itemsets: string[];
86
+ supports: Record<string, number[]>;
87
+ supportMean: Record<string, number>;
88
+ pValue: number;
89
+ adjPValue: number;
90
+ ifSignificant: boolean;
91
+ datasetClassHigherFrequency: string;
92
+ };
93
+ export type DifferentialResult = Pick<DifferentialTestResult, 'itemsets' | 'supportMean' | 'adjPValue'>;
94
+ type DifferentialAnalysisKnnParams = {
95
+ ct: string;
96
+ datasetClasses: string[];
97
+ motifs?: MotifsParam;
98
+ k?: number;
99
+ minSupport?: number;
100
+ maxDist?: number;
101
+ };
102
+ export declare function differentialTestsKnn(multi: SqMultiContext, params: DifferentialAnalysisKnnParams): Promise<DifferentialTestResult[]>;
103
+ export declare function differentialAnalysisKnn(multi: SqMultiContext, params: DifferentialAnalysisKnnParams): Promise<Record<string, DifferentialResult[]>>;
104
+ type DifferentialAnalysisDistParams = {
105
+ ct: string;
106
+ datasetClasses: string[];
107
+ motifs?: MotifsParam;
108
+ maxDist?: number;
109
+ minSupport?: number;
110
+ minSize?: number;
111
+ };
112
+ export declare function differentialTestsDist(multi: SqMultiContext, params: DifferentialAnalysisDistParams): Promise<DifferentialTestResult[]>;
113
+ export declare function differentialAnalysisDist(multi: SqMultiContext, params: DifferentialAnalysisDistParams): Promise<Record<string, DifferentialResult[]>>;
114
+ export {};
115
+ //# sourceMappingURL=multi-fov.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-fov.d.ts","sourceRoot":"","sources":["../src/multi-fov.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,325 @@
1
+ // Port of the multi-FOV class spatial_query_multi.
2
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py
3
+ import { buildContext, findCellIndicesOfType, knnTransactions, radiusTransactions, centerQueryPoints, knnNeighborhood, radiusNeighborhood, countMotifs, computeMotifEnrichment, normalizeMotifs, normalizeMotifList, motifCompositionRows, assertEnrichmentMode, findFpKnn as findFpKnnSingle, findFpDist as findFpDistSingle, } from './single-fov.js';
4
+ import { mineFrequentPatterns } from './fpgrowth.js';
5
+ import { nestedMotifDescent } from './nested.js';
6
+ import { applyFdrCorrection, fdrCorrection, mannWhitneyU, rankAverage, median, mean } from './stats.js';
7
+ // Build the multi-FOV context object.
8
+ // Unlike Python, which derives unique FOV names from the (possibly repeated) dataset names
9
+ // ('name' -> 'name_0', 'name_1', ...), each FOV has an explicit ID and class.
10
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L43
11
+ export function buildMultiContext(fovs) {
12
+ const datasetIds = fovs.map(fov => fov.datasetId);
13
+ const duplicates = datasetIds.filter((id, i) => datasetIds.indexOf(id) !== i);
14
+ if (duplicates.length > 0) {
15
+ throw new Error(`Dataset IDs must be unique. Found duplicates: ${Array.from(new Set(duplicates)).join(', ')}`);
16
+ }
17
+ return {
18
+ datasetIds,
19
+ datasetClasses: fovs.map(fov => fov.datasetClass),
20
+ contexts: fovs.map(fov => buildContext(fov)),
21
+ };
22
+ }
23
+ // The datasets (FOVs) belonging to the selected classes (all classes if not provided).
24
+ function selectFovs(multi, datasetClass) {
25
+ const validClasses = new Set(multi.datasetClasses);
26
+ const selected = datasetClass === undefined
27
+ ? validClasses
28
+ : new Set(typeof datasetClass === 'string' ? [datasetClass] : datasetClass);
29
+ for (const c of selected) {
30
+ if (!validClasses.has(c)) {
31
+ throw new Error(`Invalid dataset class: ${c}. Valid dataset classes are: ${Array.from(validClasses).join(', ')}`);
32
+ }
33
+ }
34
+ return multi.contexts
35
+ .map((context, i) => ({ datasetId: multi.datasetIds[i], datasetClass: multi.datasetClasses[i], context }))
36
+ .filter(fov => selected.has(fov.datasetClass));
37
+ }
38
+ // Throws if the cell type is absent from every FOV (selected or not, as in Python).
39
+ function assertCellTypeInAnyFov(multi, ct) {
40
+ if (!multi.contexts.some(context => context.labels.includes(ct))) {
41
+ throw new Error(`Found no ${ct} in any datasets!`);
42
+ }
43
+ }
44
+ // Unique cell type labels across all FOVs.
45
+ function allLabels(multi) {
46
+ return new Set(multi.contexts.flatMap(context => context.labels));
47
+ }
48
+ // Find frequent patterns within the k-NN neighborhoods of a cell type, pooling the
49
+ // neighborhoods of all selected FOVs.
50
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L116
51
+ export async function multiFindFpKnn(multi, params) {
52
+ const { ct, datasetClass, k = 30, minSupport = 0.5, maxDist = 20, ifMax = true } = params;
53
+ assertCellTypeInAnyFov(multi, ct);
54
+ const transactions = selectFovs(multi, datasetClass).flatMap(({ context }) => (knnTransactions(context, findCellIndicesOfType(context, ct), k, maxDist)));
55
+ return mineFrequentPatterns(transactions, minSupport, ifMax);
56
+ }
57
+ // Find frequent patterns within the radius-based neighborhoods of a cell type, pooling the
58
+ // neighborhoods of all selected FOVs.
59
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L219
60
+ export async function multiFindFpDist(multi, params) {
61
+ const { ct, datasetClass, maxDist = 20, minSize = 0, minSupport = 0.5, ifMax = true } = params;
62
+ assertCellTypeInAnyFov(multi, ct);
63
+ const transactions = selectFovs(multi, datasetClass).flatMap(({ context }) => {
64
+ const points = centerQueryPoints(context, findCellIndicesOfType(context, ct));
65
+ return radiusTransactions(context, points, maxDist, minSize).transactions;
66
+ });
67
+ return mineFrequentPatterns(transactions, minSupport, ifMax);
68
+ }
69
+ function getFov(multi, datasetId) {
70
+ const index = multi.datasetIds.indexOf(datasetId);
71
+ if (index === -1) {
72
+ throw new Error(`Found no dataset with ID ${datasetId}.`);
73
+ }
74
+ return multi.contexts[index];
75
+ }
76
+ // Find frequent (maximal) patterns within the k-NN neighborhoods of a cell type in a single FOV.
77
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L993
78
+ export async function findFpKnnFov(multi, params) {
79
+ const { ct, datasetId, k = 30, minSupport = 0.5, maxDist = 20 } = params;
80
+ const context = getFov(multi, datasetId);
81
+ if (!context.labels.includes(ct))
82
+ return [];
83
+ return findFpKnnSingle(context, { ct, k, minSupport, maxDist });
84
+ }
85
+ // Find frequent (maximal) patterns within the radius-based neighborhoods of a cell type in a single FOV.
86
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L1049
87
+ export async function findFpDistFov(multi, params) {
88
+ const { ct, datasetId, maxDist = 20, minSize = 0, minSupport = 0.5 } = params;
89
+ const context = getFov(multi, datasetId);
90
+ if (!context.labels.includes(ct))
91
+ return [];
92
+ return findFpDistSingle(context, { ct, maxDist, minSize, minSupport });
93
+ }
94
+ // Normalize user-specified motifs against the labels of all FOVs, throwing if none remain.
95
+ function normalizeMultiMotifs(multi, motifs) {
96
+ const filtered = normalizeMotifs(motifs, allLabels(multi));
97
+ if (filtered.length === 0) {
98
+ throw new Error("All cell types in motifs are missing in the cell type labels.");
99
+ }
100
+ return filtered;
101
+ }
102
+ function multiMotifEnrichment(fovs, ct, motifs, neighborhood, returnCellIds) {
103
+ const totals = motifs.map(() => ({ numCells: 0, numCenter: 0, numMotif: 0, numCenterMotif: 0 }));
104
+ const neighborIds = motifs.map(() => ({}));
105
+ const centerIds = motifs.map(() => ({}));
106
+ for (const { datasetId, context } of fovs) {
107
+ const counts = countMotifs(context, ct, motifs, neighborhood(context), returnCellIds);
108
+ counts.forEach((c, m) => {
109
+ totals[m].numCells += c.numCells;
110
+ totals[m].numCenter += c.numCenter;
111
+ totals[m].numMotif += c.numMotif;
112
+ totals[m].numCenterMotif += c.numCenterMotif;
113
+ if (returnCellIds && c.centerIndices.length > 0) {
114
+ neighborIds[m][datasetId] = c.neighborIndices.map(j => context.obsIndex[j]);
115
+ centerIds[m][datasetId] = c.centerIndices.map(i => context.obsIndex[i]);
116
+ }
117
+ });
118
+ }
119
+ const out = motifs.map((motif, m) => {
120
+ const { neighborIds: _n, centerIds: _c, ...result } = computeMotifEnrichment({ center: ct, motif, ...totals[m] });
121
+ return returnCellIds
122
+ ? { ...result, neighborIds: neighborIds[m], centerIds: centerIds[m] }
123
+ : result;
124
+ });
125
+ return applyFdrCorrection(out);
126
+ }
127
+ // Perform motif enrichment analysis using k-nearest neighbors in multiple FOVs.
128
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L319
129
+ export async function multiMotifEnrichmentKnn(multi, params) {
130
+ const { ct, datasetClass, k = 30, minSupport = 0.5, maxDist = 20, returnCellIds = false, mode = 'maximal' } = params;
131
+ const fovs = selectFovs(multi, datasetClass);
132
+ assertCellTypeInAnyFov(multi, ct);
133
+ assertEnrichmentMode(mode);
134
+ if (mode === 'nested' && params.motifs === undefined) {
135
+ return nestedMotifDescent({
136
+ testMotifs: motifs => multiMotifEnrichmentKnn(multi, { ...params, motifs, mode: 'maximal' }),
137
+ frequentPatterns: await multiFindFpKnn(multi, { ct, datasetClass, k, minSupport, maxDist, ifMax: false }),
138
+ });
139
+ }
140
+ const motifs = params.motifs === undefined
141
+ ? (await multiFindFpKnn(multi, { ct, datasetClass, k, minSupport, maxDist })).map(p => p.itemsets)
142
+ : normalizeMultiMotifs(multi, params.motifs);
143
+ return multiMotifEnrichment(fovs, ct, motifs, context => knnNeighborhood(context, k, maxDist), returnCellIds);
144
+ }
145
+ // Perform motif enrichment analysis within a radius-based neighborhood in multiple FOVs.
146
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L581
147
+ export async function multiMotifEnrichmentDist(multi, params) {
148
+ const { ct, datasetClass, maxDist = 20, minSize = 0, minSupport = 0.5, returnCellIds = false, mode = 'maximal' } = params;
149
+ const fovs = selectFovs(multi, datasetClass);
150
+ assertCellTypeInAnyFov(multi, ct);
151
+ assertEnrichmentMode(mode);
152
+ if (mode === 'nested' && params.motifs === undefined) {
153
+ return nestedMotifDescent({
154
+ testMotifs: motifs => multiMotifEnrichmentDist(multi, { ...params, motifs, mode: 'maximal' }),
155
+ frequentPatterns: await multiFindFpDist(multi, { ct, datasetClass, maxDist, minSize, minSupport, ifMax: false }),
156
+ });
157
+ }
158
+ const motifs = params.motifs === undefined
159
+ ? (await multiFindFpDist(multi, { ct, datasetClass, maxDist, minSize, minSupport })).map(p => p.itemsets)
160
+ : normalizeMultiMotifs(multi, params.motifs);
161
+ return multiMotifEnrichment(fovs, ct, motifs, context => radiusNeighborhood(context, maxDist), returnCellIds);
162
+ }
163
+ // Pool the motif composition over the selected FOVs.
164
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L851
165
+ function multiMotifComposition(multi, ct, motifsParam, datasetClass, neighborhood) {
166
+ const fovs = selectFovs(multi, datasetClass);
167
+ assertCellTypeInAnyFov(multi, ct);
168
+ const motifs = normalizeMotifList(motifsParam, allLabels(multi));
169
+ return fovs.flatMap(({ datasetId, context }) => {
170
+ const cinds = findCellIndicesOfType(context, ct);
171
+ const labelsUnique = new Set(context.labels);
172
+ // A motif with a cell type missing from this FOV has no motif-positive center here.
173
+ const active = motifs.filter(m => m.every(t => labelsUnique.has(t)));
174
+ if (cinds.length === 0 || active.length === 0)
175
+ return [];
176
+ return motifCompositionRows(context, ct, active, cinds, neighborhood(context))
177
+ .map(row => ({ datasetId, ...row }));
178
+ });
179
+ }
180
+ // Compute the composition of motif cell types in the k-NN neighborhoods of center cells across multiple FOVs.
181
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L931
182
+ export function multiMotifCompositionKnn(multi, params) {
183
+ const { ct, motifs, datasetClass, k = 30, maxDist = 20 } = params;
184
+ return multiMotifComposition(multi, ct, motifs, datasetClass, context => knnNeighborhood(context, k, maxDist));
185
+ }
186
+ // Compute the composition of motif cell types in the radius-based neighborhoods of center cells across multiple FOVs.
187
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L888
188
+ export function multiMotifCompositionDist(multi, params) {
189
+ const { ct, motifs, datasetClass, maxDist = 20 } = params;
190
+ return multiMotifComposition(multi, ct, motifs, datasetClass, context => radiusNeighborhood(context, maxDist));
191
+ }
192
+ // Normalize motifs as differential_analysis_motif_* does (no filtering of unknown cell types).
193
+ function toDifferentialMotifs(motifs) {
194
+ if (typeof motifs === 'string')
195
+ return [[motifs]];
196
+ if (motifs.length > 0 && typeof motifs[0] === 'string')
197
+ return [motifs];
198
+ return motifs;
199
+ }
200
+ // Test every motif for a difference in support between the datasets of two classes.
201
+ // Returns all tested motifs, unlike differentialAnalysisKnn/Dist which return only the significant ones.
202
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_differential_pattern.py
203
+ function differentialTests(multi, datasetClasses, ct, motifsParam,
204
+ // Support of each motif among the given center cells of a dataset.
205
+ supportsInFov) {
206
+ const motifs = [];
207
+ const motifKeys = new Set();
208
+ for (const motif of toDifferentialMotifs(motifsParam)) {
209
+ const sorted = motif.toSorted();
210
+ const key = JSON.stringify(sorted);
211
+ if (!motifKeys.has(key)) {
212
+ motifKeys.add(key);
213
+ motifs.push(sorted);
214
+ }
215
+ }
216
+ const supports = motifs.map(() => Object.fromEntries(datasetClasses.map(c => [c, []])));
217
+ for (const datasetClass of datasetClasses) {
218
+ for (const { context } of selectFovs(multi, datasetClass)) {
219
+ const cinds = findCellIndicesOfType(context, ct);
220
+ const fovSupports = cinds.length === 0 ? motifs.map(() => 0) : supportsInFov(context, cinds, motifs);
221
+ fovSupports.forEach((s, m) => supports[m][datasetClass].push(s));
222
+ }
223
+ }
224
+ const [c0, c1] = datasetClasses;
225
+ const results = motifs.map((itemsets, m) => {
226
+ const group1 = supports[m][c0];
227
+ const group2 = supports[m][c1];
228
+ let pValue = 1.0;
229
+ let datasetClassHigherFrequency = 'neither';
230
+ if (group1.length > 0 && group2.length > 0) {
231
+ pValue = mannWhitneyU(group1, group2).pValue;
232
+ // Determine which class has higher frequency using the median rank.
233
+ const ranks = rankAverage([...group1, ...group2]);
234
+ const medianRank1 = median(ranks.slice(0, group1.length));
235
+ const medianRank2 = median(ranks.slice(group1.length));
236
+ datasetClassHigherFrequency = medianRank1 > medianRank2 ? c0 : c1;
237
+ }
238
+ return {
239
+ itemsets,
240
+ supports: supports[m],
241
+ supportMean: { [c0]: mean(group1), [c1]: mean(group2) },
242
+ pValue,
243
+ datasetClassHigherFrequency,
244
+ };
245
+ });
246
+ if (results.length > 1) {
247
+ const { rejected, adjusted } = fdrCorrection(results.map(r => r.pValue), 0.05);
248
+ return results.map((r, i) => ({ ...r, adjPValue: adjusted[i], ifSignificant: rejected[i] }));
249
+ }
250
+ return results.map(r => ({ ...r, adjPValue: r.pValue, ifSignificant: r.pValue < 0.05 }));
251
+ }
252
+ // Split the significant results by the class with the higher frequency, sorted by adjusted p-value.
253
+ function splitSignificant(results, datasetClasses) {
254
+ return Object.fromEntries(datasetClasses.map(c => [
255
+ c,
256
+ results
257
+ .filter(r => r.datasetClassHigherFrequency === c && r.ifSignificant)
258
+ .map(({ itemsets, supportMean, adjPValue }) => ({ itemsets, supportMean, adjPValue }))
259
+ .toSorted((a, b) => a.adjPValue - b.adjPValue),
260
+ ]));
261
+ }
262
+ // Union of the frequent patterns discovered in each dataset of the two classes.
263
+ async function discoverMotifs(multi, datasetClasses, findFpFov) {
264
+ const motifs = new Map();
265
+ for (const datasetClass of datasetClasses) {
266
+ for (const { datasetId } of selectFovs(multi, datasetClass)) {
267
+ for (const { itemsets } of await findFpFov(datasetId)) {
268
+ motifs.set(JSON.stringify(itemsets.toSorted()), itemsets.toSorted());
269
+ }
270
+ }
271
+ }
272
+ return Array.from(motifs.values());
273
+ }
274
+ function validateDifferentialClasses(multi, datasetClasses) {
275
+ if (datasetClasses.length !== 2) {
276
+ throw new Error("Require 2 dataset classes for differential analysis.");
277
+ }
278
+ selectFovs(multi, datasetClasses);
279
+ }
280
+ // Fraction of the center cells whose neighborhood contains every motif cell type
281
+ // (0 for motifs with a cell type missing from the dataset).
282
+ function motifSupports(context, cinds, motifs, neighborsOf, isValidCenter = () => true) {
283
+ const labelsUnique = new Set(context.labels);
284
+ const neighborTypes = cinds.map((i) => {
285
+ const neighbors = neighborsOf(i);
286
+ return isValidCenter(neighbors) ? new Set(neighbors.map(j => context.labels[j])) : null;
287
+ });
288
+ return motifs.map((motif) => {
289
+ if (!motif.every(t => labelsUnique.has(t)))
290
+ return 0;
291
+ const count = neighborTypes.filter(types => types !== null && motif.every(t => types.has(t))).length;
292
+ return count / cinds.length;
293
+ });
294
+ }
295
+ // Test all motifs for differential support between two dataset classes using k-NN neighborhoods.
296
+ // Returns every tested motif (including non-significant ones).
297
+ export async function differentialTestsKnn(multi, params) {
298
+ const { ct, datasetClasses, k = 30, minSupport = 0.5, maxDist = 20 } = params;
299
+ validateDifferentialClasses(multi, datasetClasses);
300
+ const motifs = params.motifs ?? await discoverMotifs(multi, datasetClasses, datasetId => (findFpKnnFov(multi, { ct, datasetId, k, minSupport, maxDist })));
301
+ return differentialTests(multi, datasetClasses, ct, motifs, (context, cinds, ms) => (motifSupports(context, cinds, ms, knnNeighborhood(context, k, maxDist))));
302
+ }
303
+ // Perform differential analysis of motif patterns between two dataset classes using k-NN neighborhoods.
304
+ // Returns, for each class, the motifs significantly more frequent in that class.
305
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L1105
306
+ export async function differentialAnalysisKnn(multi, params) {
307
+ return splitSignificant(await differentialTestsKnn(multi, params), params.datasetClasses);
308
+ }
309
+ // Test all motifs for differential support between two dataset classes using radius-based neighborhoods.
310
+ // Returns every tested motif (including non-significant ones).
311
+ export async function differentialTestsDist(multi, params) {
312
+ const { ct, datasetClasses, maxDist = 20, minSupport = 0.5, minSize = 0 } = params;
313
+ validateDifferentialClasses(multi, datasetClasses);
314
+ const motifs = params.motifs ?? await discoverMotifs(multi, datasetClasses, datasetId => (findFpDistFov(multi, { ct, datasetId, maxDist, minSize, minSupport })));
315
+ // Center cells with neighborhoods not larger than minSize never count as having the motif,
316
+ // but still count in the denominator of the support.
317
+ return differentialTests(multi, datasetClasses, ct, motifs, (context, cinds, ms) => (motifSupports(context, cinds, ms, radiusNeighborhood(context, maxDist), neighbors => neighbors.length > minSize)));
318
+ }
319
+ // Perform differential analysis of motif patterns between two dataset classes using radius-based neighborhoods.
320
+ // Returns, for each class, the motifs significantly more frequent in that class.
321
+ // Reference: https://github.com/ShaokunAn/Spatial-Query/blob/9250b61/SpatialQuery/spatial_query_multiple_fov.py#L1206
322
+ export async function differentialAnalysisDist(multi, params) {
323
+ return splitSignificant(await differentialTestsDist(multi, params), params.datasetClasses);
324
+ }
325
+ //# sourceMappingURL=multi-fov.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-fov.js","sourceRoot":"","sources":["../src/multi-fov.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type FrequentPattern } from './fpgrowth.js';
2
+ type TestedMotif = {
3
+ motifs: string[];
4
+ pValue: number;
5
+ adjPValue?: number;
6
+ ifSignificant?: boolean;
7
+ };
8
+ type NestedMotifDescentParams<T> = {
9
+ testMotifs: (motifs: string[][]) => Promise<T[]>;
10
+ frequentPatterns: FrequentPattern[];
11
+ supportTol?: number;
12
+ maxTestedPatterns?: number;
13
+ maxExpansionFactor?: number;
14
+ };
15
+ export declare function nestedMotifDescent<T extends TestedMotif>(params: NestedMotifDescentParams<T>): Promise<T[]>;
16
+ export {};
17
+ //# sourceMappingURL=nested.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nested.d.ts","sourceRoot":"","sources":["../src/nested.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AA4B1E,KAAK,WAAW,GAAG;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAKrG,KAAK,wBAAwB,CAAC,CAAC,IAAI;IAGjC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAGjD,gBAAgB,EAAE,eAAe,EAAE,CAAC;IAEpC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAIF,wBAAsB,kBAAkB,CAAC,CAAC,SAAS,WAAW,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAwFjH"}