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.
- package/LICENSE +21 -0
- package/README.md +169 -2
- package/dist/assert.d.ts +15 -0
- package/dist/assert.d.ts.map +1 -0
- package/dist/assert.js +23 -0
- package/dist/assert.js.map +1 -0
- package/dist/bundled/index.js +14245 -0
- package/dist/bundled/index.js.map +1 -0
- package/dist/fpgrowth.d.ts +10 -0
- package/dist/fpgrowth.d.ts.map +1 -0
- package/dist/fpgrowth.js +35 -0
- package/dist/fpgrowth.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/multi-fov.d.ts +115 -0
- package/dist/multi-fov.d.ts.map +1 -0
- package/dist/multi-fov.js +325 -0
- package/dist/multi-fov.js.map +1 -0
- package/dist/nested.d.ts +17 -0
- package/dist/nested.d.ts.map +1 -0
- package/dist/nested.js +106 -0
- package/dist/nested.js.map +1 -0
- package/dist/single-fov.d.ts +149 -0
- package/dist/single-fov.d.ts.map +1 -0
- package/dist/single-fov.js +488 -0
- package/dist/single-fov.js.map +1 -0
- package/dist/stats.d.ts +25 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +141 -0
- package/dist/stats.js.map +1 -0
- package/package.json +41 -3
|
@@ -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"}
|
package/dist/fpgrowth.js
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|
package/dist/nested.d.ts
ADDED
|
@@ -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"}
|