SPB Git

spb/wp44_uqo

Public

WP44: Appendices B, C (Agent L); Part IV aligned with code; provenance macros

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Nov 3, 2026) parent 3951030 Browse files

11 changed files +950 −14

modified agents/REGISTER.md +1 −1
@@ -10,4 +10,4 @@
10 | 2026-11-03 | N (code auditor, subagent) | prompt in session | reports/audit/CODE_AUDIT_2026-11-03.md, code_issues.csv (67 issues: 2 blocking, 20 major, 45 minor) | A: P0 + main P1 fixed in commit of 2026-11-03 17:10 (see reports/DISCREPANCIES_PLAN_VS_CODE.md) | delivered | 10 | 2026-11-03 | N (code auditor, subagent) | prompt in session | reports/audit/CODE_AUDIT_2026-11-03.md, code_issues.csv (67 issues: 2 blocking, 20 major, 45 minor) | A: P0 + main P1 fixed in commit of 2026-11-03 17:10 (see reports/DISCREPANCIES_PLAN_VS_CODE.md) | delivered |
11 | 2026-11-03 | L (appendices A/E/H, subagent) | agents/briefs/WRITER_APPENDICES_AEH.md | manuscript/appendices/appA_taxonomy.tex (8,360 w), appE_data_dictionary.tex (5,598 w, schema-checked), appH_reproducibility.tex (3,446 w) | M (compile) + N (Phase 8) | delivered | 11 | 2026-11-03 | L (appendices A/E/H, subagent) | agents/briefs/WRITER_APPENDICES_AEH.md | manuscript/appendices/appA_taxonomy.tex (8,360 w), appE_data_dictionary.tex (5,598 w, schema-checked), appH_reproducibility.tex (3,446 w) | M (compile) + N (Phase 8) | delivered |
12 | 2026-11-03 | L (Part II, subagent) | agents/briefs/WRITER_PART02.md | manuscript/sections/part02_evolution.tex (12,677 w, 224 verified refs) | K + M | delivered | 12 | 2026-11-03 | L (Part II, subagent) | agents/briefs/WRITER_PART02.md | manuscript/sections/part02_evolution.tex (12,677 w, 224 verified refs) | K + M | delivered |
13−| 2026-11-03 | L (appendices B/C, subagent) | agents/briefs/WRITER_APPENDICES_BC.md | appB_search_and_sources.tex, appC_derivations.tex | K + M | running | 13+| 2026-11-03 | L (appendices B/C, subagent) | agents/briefs/WRITER_APPENDICES_BC.md | appB_search_and_sources.tex (5,336 w), appC_derivations.tex (6,509 w), references_appBC.bib (5 verified) | K + M; A aligned Part IV with the code (α MASI, standardised features, cutoffs, diversity script) | delivered |
added data/metadata/acl_parse_report.json +13 −0
@@ -0,0 +1,13 @@
1+{
2+ "input": "data/raw/acl/anthology+abstracts.bib.gz",
3+ "sha256": "44c3f7e907f221b740bea09069818a3d7c0dfd88b2da3b750d9f02955efc58b3",
4+ "bytes": 46723382,
5+ "entries": 138796,
6+ "types": {
7+ "proceedings": 3016,
8+ "inproceedings": 132105,
9+ "article": 3453,
10+ "book": 222
11+ },
12+ "parsed_at": "2026-11-03T02:21:46.022435+00:00"
13+}
\ No newline at end of file
added data/metadata/api_increment_ledger.json +397 −0
@@ -0,0 +1,397 @@
1+{
2+ "slices": {
3+ "2026-10-01_cs_primary": {
4+ "pages": 36,
5+ "records": 7092,
6+ "done": true,
7+ "count": 7092
8+ },
9+ "2026-10-01_cs_secondary": {
10+ "pages": 31,
11+ "records": 6167,
12+ "done": true,
13+ "count": 6167
14+ },
15+ "2026-10-02_cs_primary": {
16+ "pages": 17,
17+ "records": 3365,
18+ "done": true,
19+ "count": 3365
20+ },
21+ "2026-10-02_cs_secondary": {
22+ "pages": 11,
23+ "records": 2057,
24+ "done": true,
25+ "count": 2057
26+ },
27+ "2026-10-03_cs_primary": {
28+ "pages": 9,
29+ "records": 1735,
30+ "done": true,
31+ "count": 1735
32+ },
33+ "2026-10-03_cs_secondary": {
34+ "pages": 49,
35+ "records": 9746,
36+ "done": true,
37+ "count": 9746
38+ },
39+ "2026-10-04_cs_primary": {
40+ "pages": 9,
41+ "records": 1764,
42+ "done": true,
43+ "count": 1764
44+ },
45+ "2026-10-04_cs_secondary": {
46+ "pages": 30,
47+ "records": 5919,
48+ "done": true,
49+ "count": 5919
50+ },
51+ "2026-10-05_cs_primary": {
52+ "pages": 16,
53+ "records": 3091,
54+ "done": true,
55+ "count": 3091
56+ },
57+ "2026-10-05_cs_secondary": {
58+ "pages": 12,
59+ "records": 2215,
60+ "done": true,
61+ "count": 2215
62+ },
63+ "2026-10-06_cs_primary": {
64+ "pages": 18,
65+ "records": 3537,
66+ "done": true,
67+ "count": 3537
68+ },
69+ "2026-10-06_cs_secondary": {
70+ "pages": 14,
71+ "records": 2622,
72+ "done": true,
73+ "count": 2622
74+ },
75+ "2026-10-07_cs_primary": {
76+ "pages": 18,
77+ "records": 3597,
78+ "done": true,
79+ "count": 3597
80+ },
81+ "2026-10-07_cs_secondary": {
82+ "pages": 13,
83+ "records": 2515,
84+ "done": true,
85+ "count": 2515
86+ },
87+ "2026-10-08_cs_primary": {
88+ "pages": 18,
89+ "records": 3425,
90+ "done": true,
91+ "count": 3425
92+ },
93+ "2026-10-08_cs_secondary": {
94+ "pages": 14,
95+ "records": 2624,
96+ "done": true,
97+ "count": 2624
98+ },
99+ "2026-10-09_cs_primary": {
100+ "pages": 16,
101+ "records": 3129,
102+ "done": true,
103+ "count": 3129
104+ },
105+ "2026-10-09_cs_secondary": {
106+ "pages": 12,
107+ "records": 2312,
108+ "done": true,
109+ "count": 2312
110+ },
111+ "2026-10-10_cs_primary": {
112+ "pages": 10,
113+ "records": 1968,
114+ "done": true,
115+ "count": 1968
116+ },
117+ "2026-10-10_cs_secondary": {
118+ "pages": 8,
119+ "records": 1504,
120+ "done": true,
121+ "count": 1504
122+ },
123+ "2026-10-11_cs_primary": {
124+ "pages": 9,
125+ "records": 1668,
126+ "done": true,
127+ "count": 1668
128+ },
129+ "2026-10-11_cs_secondary": {
130+ "pages": 7,
131+ "records": 1278,
132+ "done": true,
133+ "count": 1278
134+ },
135+ "2026-10-12_cs_primary": {
136+ "pages": 15,
137+ "records": 2896,
138+ "done": true,
139+ "count": 2896
140+ },
141+ "2026-10-12_cs_secondary": {
142+ "pages": 12,
143+ "records": 2209,
144+ "done": true,
145+ "count": 2209
146+ },
147+ "2026-10-13_cs_primary": {
148+ "pages": 17,
149+ "records": 3289,
150+ "done": true,
151+ "count": 3289
152+ },
153+ "2026-10-13_cs_secondary": {
154+ "pages": 14,
155+ "records": 2717,
156+ "done": true,
157+ "count": 2717
158+ },
159+ "2026-10-14_cs_primary": {
160+ "pages": 17,
161+ "records": 3209,
162+ "done": true,
163+ "count": 3209
164+ },
165+ "2026-10-14_cs_secondary": {
166+ "pages": 13,
167+ "records": 2555,
168+ "done": true,
169+ "count": 2555
170+ },
171+ "2026-10-15_cs_primary": {
172+ "pages": 19,
173+ "records": 3758,
174+ "done": true,
175+ "count": 3758
176+ },
177+ "2026-10-15_cs_secondary": {
178+ "pages": 14,
179+ "records": 2684,
180+ "done": true,
181+ "count": 2684
182+ },
183+ "2026-10-16_cs_primary": {
184+ "pages": 15,
185+ "records": 2870,
186+ "done": true,
187+ "count": 2870
188+ },
189+ "2026-10-16_cs_secondary": {
190+ "pages": 50,
191+ "records": 10000,
192+ "done": true,
193+ "count": 37712,
194+ "truncated": true
195+ },
196+ "2026-10-17_cs_primary": {
197+ "pages": 9,
198+ "records": 1796,
199+ "done": true,
200+ "count": 1796
201+ },
202+ "2026-10-17_cs_secondary": {
203+ "pages": 7,
204+ "records": 1244,
205+ "done": true,
206+ "count": 1244
207+ },
208+ "2026-10-18_cs_primary": {
209+ "pages": 8,
210+ "records": 1593,
211+ "done": true,
212+ "count": 1593
213+ },
214+ "2026-10-18_cs_secondary": {
215+ "pages": 6,
216+ "records": 1097,
217+ "done": true,
218+ "count": 1097
219+ },
220+ "2026-10-19_cs_primary": {
221+ "pages": 16,
222+ "records": 3118,
223+ "done": true,
224+ "count": 3118
225+ },
226+ "2026-10-19_cs_secondary": {
227+ "pages": 12,
228+ "records": 2281,
229+ "done": true,
230+ "count": 2281
231+ },
232+ "2026-10-20_cs_primary": {
233+ "pages": 16,
234+ "records": 3056,
235+ "done": true,
236+ "count": 3056
237+ },
238+ "2026-10-20_cs_secondary": {
239+ "pages": 13,
240+ "records": 2402,
241+ "done": true,
242+ "count": 2402
243+ },
244+ "2026-10-21_cs_primary": {
245+ "pages": 17,
246+ "records": 3241,
247+ "done": true,
248+ "count": 3241
249+ },
250+ "2026-10-21_cs_secondary": {
251+ "pages": 13,
252+ "records": 2488,
253+ "done": true,
254+ "count": 2488
255+ },
256+ "2026-10-22_cs_primary": {
257+ "pages": 16,
258+ "records": 3025,
259+ "done": true,
260+ "count": 3025
261+ },
262+ "2026-10-22_cs_secondary": {
263+ "pages": 12,
264+ "records": 2346,
265+ "done": true,
266+ "count": 2346
267+ },
268+ "2026-10-23_cs_primary": {
269+ "pages": 17,
270+ "records": 3220,
271+ "done": true,
272+ "count": 3220
273+ },
274+ "2026-10-23_cs_secondary": {
275+ "pages": 13,
276+ "records": 2401,
277+ "done": true,
278+ "count": 2401
279+ },
280+ "2026-10-24_cs_primary": {
281+ "pages": 11,
282+ "records": 2074,
283+ "done": true,
284+ "count": 2074
285+ },
286+ "2026-10-24_cs_secondary": {
287+ "pages": 9,
288+ "records": 1784,
289+ "done": true,
290+ "count": 1784
291+ },
292+ "2026-10-25_cs_primary": {
293+ "pages": 9,
294+ "records": 1735,
295+ "done": true,
296+ "count": 1735
297+ },
298+ "2026-10-25_cs_secondary": {
299+ "pages": 9,
300+ "records": 1772,
301+ "done": true,
302+ "count": 1772
303+ },
304+ "2026-10-26_cs_primary": {
305+ "pages": 16,
306+ "records": 3197,
307+ "done": true,
308+ "count": 3197
309+ },
310+ "2026-10-26_cs_secondary": {
311+ "pages": 14,
312+ "records": 2719,
313+ "done": true,
314+ "count": 2719
315+ },
316+ "2026-10-27_cs_primary": {
317+ "pages": 15,
318+ "records": 2953,
319+ "done": true,
320+ "count": 2953
321+ },
322+ "2026-10-27_cs_secondary": {
323+ "pages": 15,
324+ "records": 2829,
325+ "done": true,
326+ "count": 2829
327+ },
328+ "2026-10-28_cs_primary": {
329+ "pages": 15,
330+ "records": 2910,
331+ "done": true,
332+ "count": 2910
333+ },
334+ "2026-10-28_cs_secondary": {
335+ "pages": 12,
336+ "records": 2234,
337+ "done": true,
338+ "count": 2234
339+ },
340+ "2026-10-29_cs_primary": {
341+ "pages": 17,
342+ "records": 3363,
343+ "done": true,
344+ "count": 3363
345+ },
346+ "2026-10-29_cs_secondary": {
347+ "pages": 13,
348+ "records": 2544,
349+ "done": true,
350+ "count": 2544
351+ },
352+ "2026-10-30_cs_primary": {
353+ "pages": 17,
354+ "records": 3266,
355+ "done": true,
356+ "count": 3266
357+ },
358+ "2026-10-30_cs_secondary": {
359+ "pages": 49,
360+ "records": 9607,
361+ "done": true,
362+ "count": 9607
363+ },
364+ "2026-10-31_cs_primary": {
365+ "pages": 11,
366+ "records": 2044,
367+ "done": true,
368+ "count": 2044
369+ },
370+ "2026-10-31_cs_secondary": {
371+ "pages": 8,
372+ "records": 1600,
373+ "done": true,
374+ "count": 1600
375+ },
376+ "2026-11-01_cs_primary": {
377+ "pages": 8,
378+ "records": 1559,
379+ "done": true,
380+ "count": 1559
381+ },
382+ "2026-11-01_cs_secondary": {
383+ "pages": 7,
384+ "records": 1354,
385+ "done": true,
386+ "count": 1354
387+ },
388+ "2026-11-02_cs_primary": {
389+ "pages": 5,
390+ "records": 1000,
391+ "done": false,
392+ "count": 1832
393+ }
394+ },
395+ "calls": 1002,
396+ "cost_usd_total": 0.09990000000000183
397+}
\ No newline at end of file
added data/metadata/dblp_parse_report.json +114 −0
@@ -0,0 +1,114 @@
1+{
2+ "input": "/Users/simon-pierreboucher/wp44_uqo/data/raw/dblp/dblp.xml.gz",
3+ "input_bytes": 1116270104,
4+ "input_md5_first_GiB": "187624d86f19db0c6daacc099f11b778",
5+ "parsed_at": "2026-11-03T02:27:30.783487+00:00",
6+ "rows_written": 8840866,
7+ "min_year": 0,
8+ "counts_by_type": {
9+ "incollection": 71247,
10+ "book": 21648,
11+ "proceedings": 65792,
12+ "mastersthesis": 27,
13+ "data": 30631,
14+ "article": 4500501,
15+ "inproceedings": 3995530,
16+ "phdthesis": 158398
17+ },
18+ "counts_by_year": {
19+ "1936": 12,
20+ "1937": 16,
21+ "1938": 11,
22+ "1939": 18,
23+ "1940": 10,
24+ "1941": 13,
25+ "1942": 13,
26+ "1943": 8,
27+ "1944": 5,
28+ "1945": 9,
29+ "1946": 31,
30+ "1947": 10,
31+ "1948": 41,
32+ "1949": 52,
33+ "1950": 29,
34+ "1951": 46,
35+ "1952": 115,
36+ "1953": 173,
37+ "1954": 226,
38+ "1955": 213,
39+ "1956": 355,
40+ "1957": 343,
41+ "1958": 464,
42+ "1959": 716,
43+ "1960": 625,
44+ "1961": 903,
45+ "1962": 1186,
46+ "1963": 1034,
47+ "1964": 1108,
48+ "1965": 1291,
49+ "1966": 1506,
50+ "1967": 1763,
51+ "1968": 2184,
52+ "1969": 2120,
53+ "1970": 2239,
54+ "1971": 3138,
55+ "1972": 3774,
56+ "1973": 4434,
57+ "1974": 5037,
58+ "1975": 5307,
59+ "1976": 5766,
60+ "1977": 6048,
61+ "1978": 6862,
62+ "1979": 7045,
63+ "1980": 7931,
64+ "1981": 8797,
65+ "1982": 10070,
66+ "1983": 10981,
67+ "1984": 12452,
68+ "1985": 14028,
69+ "1986": 16627,
70+ "1987": 17875,
71+ "1988": 22028,
72+ "1989": 24567,
73+ "1990": 28769,
74+ "1991": 31766,
75+ "1992": 35486,
76+ "1993": 41246,
77+ "1994": 45575,
78+ "1995": 47992,
79+ "1996": 53087,
80+ "1997": 57423,
81+ "1998": 64742,
82+ "1999": 71314,
83+ "2000": 81557,
84+ "2001": 87405,
85+ "2002": 98626,
86+ "2003": 118281,
87+ "2004": 137602,
88+ "2005": 160421,
89+ "2006": 178083,
90+ "2007": 191043,
91+ "2008": 205328,
92+ "2009": 224377,
93+ "2010": 231160,
94+ "2011": 252779,
95+ "2012": 265810,
96+ "2013": 282991,
97+ "2014": 294858,
98+ "2015": 305175,
99+ "2016": 317540,
100+ "2017": 342474,
101+ "2018": 378942,
102+ "2019": 422314,
103+ "2020": 439815,
104+ "2021": 468931,
105+ "2022": 489072,
106+ "2023": 530579,
107+ "2024": 590864,
108+ "2025": 605696,
109+ "2026": 446274,
110+ "2027": 3814,
111+ "None": 2908
112+ },
113+ "seconds": 285
114+}
\ No newline at end of file
modified manuscript/appendices/appB_search_and_sources.tex +2 −2
@@ -177,7 +177,7 @@ exists in the slim table of all works but not in the retained subset, that is,
177 works indexed by DBLP that OpenAlex labels with no computer-science topic. 177 works indexed by DBLP that OpenAlex labels with no computer-science topic.
178 Rather than accept OpenAlex's boundary, the pipeline reads the bucket a 178 Rather than accept OpenAlex's boundary, the pipeline reads the bucket a
179 second time in \emph{identifier-set mode}. The linkage script writes 179 second time in \emph{identifier-set mode}. The linkage script writes
180−the list \texttt{data/metadata/needed\_oa\_ids.csv} of OpenAlex identifiers to 180+the list \texttt{data/metadata/}\allowbreak\texttt{needed\_oa\_ids.csv} of OpenAlex identifiers to
181 recover (\LinkNeededOaIdsSecondPassDblpDoi{} reached through a DBLP DOI and 181 recover (\LinkNeededOaIdsSecondPassDblpDoi{} reached through a DBLP DOI and
182 \LinkNeededOaIdsSecondPassArxivDoi{} through an arXiv DOI), and 182 \LinkNeededOaIdsSecondPassArxivDoi{} through an arXiv DOI), and
183 \texttt{openalex\_snapshot.py --id-list} streams every part file again, 183 \texttt{openalex\_snapshot.py --id-list} streams every part file again,
@@ -590,7 +590,7 @@ interim figure until the principal investigator's review (checkpoint H-1).
590 590
591 The acquisition can be repeated from the runbook in six commands, in the 591 The acquisition can be repeated from the runbook in six commands, in the
592 order of Table~\ref{tab:appB-acq}, on a machine with Python~3.12 and the 592 order of Table~\ref{tab:appB-acq}, on a machine with Python~3.12 and the
593−locked environment of \texttt{reproducibility/environment\_M3U96b.txt}: 593+locked environment of \texttt{reproducibility/}\allowbreak\texttt{environment\_M3U96b.txt}:
594 \begin{enumerate} 594 \begin{enumerate}
595 \item \texttt{openalex\_snapshot.py} with the manifest copy (then once more with \texttt{--id-list}); 595 \item \texttt{openalex\_snapshot.py} with the manifest copy (then once more with \texttt{--id-list});
596 \item \texttt{openalex\_entities.py}; 596 \item \texttt{openalex\_entities.py};
modified manuscript/appendices/appC_derivations.tex +376 −1
@@ -392,7 +392,7 @@ followed by normalisation, $R_{t+1}(r) = \tilde R_{t+1}(r) / \sum_{r'}
392 predictive likelihood of $y_{t+1}$. Then $\sum_{r \ge 1}\tilde R_{t+1}(r) = 392 predictive likelihood of $y_{t+1}$. Then $\sum_{r \ge 1}\tilde R_{t+1}(r) =
393 (1-H) Z_t$ and $\tilde R_{t+1}(0) = H Z_t$, so the normaliser is $Z_t$ and 393 (1-H) Z_t$ and $\tilde R_{t+1}(0) = H Z_t$, so the normaliser is $Z_t$ and
394 \begin{equation} 394 \begin{equation}
395− R_{t+1}(0) \;=\; \frac{H Z_t}{H Z_t + (1-H) Z_t} \;=\; H \qquad \text{for every } t . 395+ R_{t+1}(0) \;=\; \frac{H Z_t}{H Z_t + (1-H) Z_t} \;=\; H \qquad \text{for every } t.
396 \label{eq:appC-r0} 396 \label{eq:appC-r0}
397 \end{equation} 397 \end{equation}
398 The filtered probability that a changepoint occurs \emph{at} the current 398 The filtered probability that a changepoint occurs \emph{at} the current
@@ -417,3 +417,378 @@ one; the smoothed posterior of \citet{fearnhead2006exact} would require a
417 backward pass and answers the retrospective question that the offline 417 backward pass and answers the retrospective question that the offline
418 methods of Sections~\ref{sec:appC-bp} and~\ref{sec:appC-pelt} already 418 methods of Sections~\ref{sec:appC-bp} and~\ref{sec:appC-pelt} already
419 address. 419 address.
420+
421+\subsection{The Gini coefficient: rank form and Lorenz form}
422+\label{sec:appC-gini}
423+
424+Let $c_{(1)} \le c_{(2)} \le \dots \le c_{(n)}$ be the citation counts of
425+the $n$ works of a publication year sorted in ascending order, $S =
426+\sum_i c_{(i)} > 0$ their total, and $L_i = \sum_{j \le i} c_{(j)} / S$ the
427+cumulative share held by the $i$ least-cited works, with $L_0 = 0$ and
428+$L_n = 1$. The Lorenz curve \citep{lorenz1905concentration} is the polygon
429+through the points $(i/n, L_i)$, and the Gini coefficient is defined as one
430+minus twice the area $A$ under it \citep{ceriani2012gini}. By the
431+trapezoidal rule, which is exact for a polygon,
432+\begin{equation}
433+ A \;=\; \sum_{i=1}^{n} \frac{1}{n}\cdot\frac{L_{i-1} + L_i}{2}
434+ \;=\; \frac{1}{2n}\Bigl( 2\sum_{i=1}^{n} L_i - L_n \Bigr)
435+ \;=\; \frac{1}{n}\sum_{i=1}^{n} L_i - \frac{1}{2n}.
436+\end{equation}
437+Exchanging the order of summation in $\sum_i L_i$,
438+\begin{equation}
439+ \sum_{i=1}^{n} L_i \;=\; \frac{1}{S}\sum_{i=1}^{n}\sum_{j=1}^{i} c_{(j)}
440+ \;=\; \frac{1}{S}\sum_{j=1}^{n} (n - j + 1)\, c_{(j)}
441+ \;=\; (n+1) - \frac{1}{S}\sum_{j=1}^{n} j\, c_{(j)},
442+\end{equation}
443+so that
444+\begin{equation}
445+ G \;=\; 1 - 2A
446+ \;=\; 1 - \frac{2(n+1)}{n} + \frac{2}{nS}\sum_{j=1}^{n} j\, c_{(j)} + \frac{1}{n}
447+ \;=\; \frac{2\sum_{j=1}^{n} j\, c_{(j)}}{n \sum_{j} c_{(j)}} - \frac{n+1}{n},
448+ \label{eq:appC-gini}
449+\end{equation}
450+which is equation~\eqref{eq:gini} of Part~IV and the expression that
451+\texttt{bibliometrics/03\_citation\_impact.py} evaluates in SQL, the rank
452+$j$ being the window function \texttt{row\_number()} partitioned by year and
453+ordered by the citation count and then by the work identifier.
454+The secondary ordering by work identifier is needed only to make the rank a
455+permutation when counts tie; since tied values receive consecutive ranks and
456+contribute $c \cdot (j + j')$ to the numerator whichever of the two tied
457+works gets the smaller rank, the value of $G$ does not depend on how ties are
458+broken. The bounds follow from \eqref{eq:appC-gini}: $G = 0$ when all
459+$c_{(j)}$ are equal (then $\sum_j j c_{(j)} = c\,n(n+1)/2$ and the two terms
460+cancel), and $G = 1 - 1/n$ when a single work holds all citations (then
461+$\sum_j j c_{(j)} = nS$), so the maximum attainable value is $1 - 1/n$ rather
462+than one and the coefficient is not normalised by that factor. Uncited works
463+enter with $c_{(j)} = 0$ at the lowest ranks; adding $u$ uncited works to a
464+year leaves $\sum_j j c_{(j)}$ shifted by $uS$ and $n$ increased by $u$, and
465+one checks from \eqref{eq:appC-gini} that $G$ increases, which is the
466+direction stated in Part~IV and the reason the uncited share accompanies the
467+coefficient in the tables.
468+
469+\subsection{Rao--Stirling and Leinster--Cobbold at order two}
470+\label{sec:appC-diversity}
471+
472+Let $p \in \R^K$ be a probability vector over categories, $\delta_{ij} \in
473+[0,1]$ a dissimilarity with $\delta_{ii} = 0$, and $Z = (z_{ij})$ the
474+similarity matrix $z_{ij} = 1 - \delta_{ij}$, so that $z_{ii} = 1$. The
475+Rao--Stirling index \citep{rao1982diversity, stirling2007diversity} is
476+$\Delta_{\mathrm{RS}}(p) = \sum_{i \ne j} p_i p_j \delta_{ij} = p^{\top}\Delta p$
477+with $\Delta = (\delta_{ij})$, the diagonal contributing nothing. The
478+Leinster--Cobbold diversity of order $q$ \citep{leinster2012diversity} is
479+${}^{q}D^{Z}(p) = \bigl(\sum_{i : p_i > 0} p_i (Zp)_i^{q-1}\bigr)^{1/(1-q)}$;
480+at $q = 2$ the exponent $1/(1-q) = -1$ and the inner power is one, so
481+\begin{equation}
482+ {}^{2}D^{Z}(p) \;=\; \Bigl(\sum_i p_i (Zp)_i\Bigr)^{-1} \;=\; \frac{1}{p^{\top} Z p}.
483+\end{equation}
484+Since $Z = \mathbf{1}\mathbf{1}^{\top} - \Delta$ entrywise (using $z_{ii} = 1
485+= 1 - \delta_{ii}$ on the diagonal as well), and $p^{\top}\mathbf{1}\mathbf{1}^{\top}p
486+= (\sum_i p_i)^2 = 1$,
487+\begin{equation}
488+ p^{\top} Z p \;=\; 1 - p^{\top}\Delta p \;=\; 1 - \Delta_{\mathrm{RS}}(p),
489+ \qquad\text{hence}\qquad
490+ {}^{2}D^{Z}(p) \;=\; \frac{1}{1 - \Delta_{\mathrm{RS}}(p)},
491+ \label{eq:appC-lc2}
492+\end{equation}
493+the identity quoted in Part~IV\@. It shows that at order two the two
494+families carry the same information: ${}^{2}D^{Z}$ is a strictly increasing
495+function of $\Delta_{\mathrm{RS}}$ on $[0, 1)$, and the ordering of years or
496+categories by either index is the same. They differ in scale and in
497+behaviour near saturation. $\Delta_{\mathrm{RS}}$ is bounded by the mean
498+dissimilarity and compresses differences among very even distributions;
499+${}^{2}D^{Z}$ is an effective number of categories, equal to $K$ for the
500+uniform distribution over $K$ mutually dissimilar categories
501+($\Delta_{\mathrm{RS}} = 1 - 1/K$) and to one for a distribution concentrated
502+on a single category ($\Delta_{\mathrm{RS}} = 0$), and it expands the
503+compressed end. The identity requires only $z_{ii} = 1$ and $z_{ij} = 1 -
504+\delta_{ij}$; it does not require $\delta$ to be a metric, and the
505+dissimilarity used, one minus a cosine similarity of category centroids,
506+is not one. The script \texttt{bibliometrics/04\_diversity\_cagr.py}
507+computes both quantities from the yearly category mix exactly as
508+\eqref{eq:appC-lc2} prescribes, $\Delta_{\mathrm{RS}} = p^{\top}(1 - Z)p$
509+with the diagonal of $Z$ set to one and ${}^{2}D^{Z} = 1/(p^{\top}Zp)$, and
510+attaches a percentile bootstrap interval to $\Delta_{\mathrm{RS}}$ by
511+multinomial resampling of the works over categories ($B = 500$, seed 44),
512+which is the sampling model under which the category counts of a year are
513+a multinomial draw of fixed size; the interval of ${}^{2}D^{Z}$ follows by
514+the monotone transformation.
515+
516+\subsection{Modularity of a directed weighted graph at a fixed partition}
517+\label{sec:appC-modularity}
518+
519+Let $W \in \R_{\ge 0}^{K \times K}$ be the flow matrix of a citing year,
520+$W_{ij}$ the number of citations from category $i$ to category $j$, with
521+$m = \sum_{ij} W_{ij}$, out-strength $k^{\mathrm{out}}_i = \sum_j W_{ij}$ and
522+in-strength $k^{\mathrm{in}}_j = \sum_i W_{ij}$, and let $g : \{1, \dots, K\}
523+\to \mathcal{G}$ be a given assignment of categories to communities. The
524+statistic implemented by \texttt{modularity()} in
525+\texttt{knowledge\_graph/02\_category\_flows.py} is
526+\begin{equation}
527+ Q(W, g) \;=\; \frac{1}{m}\sum_{i,j}\Bigl( W_{ij} - \frac{k^{\mathrm{out}}_i k^{\mathrm{in}}_j}{m} \Bigr)\mathbf{1}[g_i = g_j],
528+ \label{eq:appC-Q}
529+\end{equation}
530+the directed form of \citet{leicht2008directed}, which reduces to the
531+Newman--Girvan modularity \citep{newman2004community} when $W$ is symmetric
532+(then $k^{\mathrm{out}} = k^{\mathrm{in}} = k$ and $m = 2|E|$ for an
533+unweighted graph). Three facts are used in Part~IV\@. First, the null term
534+is the expected weight of the edge $i \to j$ under random rewiring that
535+preserves every node's out- and in-strength in expectation: a configuration
536+model in which each of the $m$ units of weight leaves node $i$ with
537+probability $k^{\mathrm{out}}_i/m$ and enters node $j$ with probability
538+$k^{\mathrm{in}}_j/m$ independently gives expected weight
539+$m \cdot (k^{\mathrm{out}}_i/m)(k^{\mathrm{in}}_j/m) = k^{\mathrm{out}}_i
540+k^{\mathrm{in}}_j/m$, and summing over $j$ recovers $k^{\mathrm{out}}_i$, so
541+the null model has the observed strengths. Second, $Q$ vanishes when all
542+nodes are in one community: then the indicator is identically one and
543+$\sum_{ij} W_{ij} = m = \sum_{ij} k^{\mathrm{out}}_i k^{\mathrm{in}}_j/m$.
544+Third, writing $e_{gg} = \sum_{i,j : g_i = g_j = g} W_{ij}/m$ for the fraction
545+of weight inside community $g$, $a^{\mathrm{out}}_g = \sum_{i : g_i = g}
546+k^{\mathrm{out}}_i/m$ and $a^{\mathrm{in}}_g$ likewise,
547+\begin{equation}
548+ Q \;=\; \sum_{g \in \mathcal{G}} \bigl( e_{gg} - a^{\mathrm{out}}_g\, a^{\mathrm{in}}_g \bigr),
549+ \label{eq:appC-Qcomm}
550+\end{equation}
551+so that $Q \le \sum_g e_{gg} \le 1$ and $Q \ge -\sum_g a^{\mathrm{out}}_g
552+a^{\mathrm{in}}_g \ge -1$; the value is positive when more weight stays
553+inside communities than the strength-preserving null predicts. The
554+self-share reported alongside, $\operatorname{tr}(W)/m = \sum_i e_{ii}$ at
555+the category partition, is the first term of \eqref{eq:appC-Qcomm} alone and
556+differs from $Q_{\mathrm{cat}}$ by the correction $\sum_i a^{\mathrm{out}}_i
557+a^{\mathrm{in}}_i$, which grows with the concentration of flows on a few
558+large categories. For the area partition, \eqref{eq:appC-Qcomm} is summed
559+over the eight areas with $e_{\alpha\alpha}$ the within-area share, which is
560+one minus the cross-area share $X_{\alpha,t}$ of Part~IV weighted by the
561+area's out-strength; $Q_{\mathrm{area}}$ is therefore a strength-weighted,
562+null-corrected average of the within-area shares, and a fall in
563+$Q_{\mathrm{area}}$ can arise from a rise in boundary crossing or from a
564+shift of out-strength toward areas whose $a^{\mathrm{out}}_\alpha
565+a^{\mathrm{in}}_\alpha$ is large. Because the partition is fixed rather than
566+optimised, none of the resolution-limit results for maximised modularity
567+\citep{fortunato2007resolution} applies; $Q$ is here a descriptive index and
568+its comparison across years is meaningful only because the partition and
569+the category definitions are the same in every year.
570+
571+\subsection{Krippendorff's \texorpdfstring{$\alpha$}{alpha} with the MASI distance}
572+\label{sec:appC-alpha}
573+
574+\paragraph{General form.}
575+Krippendorff's $\alpha$ \citep{hayes2007krippendorff, artstein2008agreement}
576+is defined for any difference function $d(v, v') \ge 0$ on the values that
577+coders may assign, with $d(v, v) = 0$, as
578+\begin{equation}
579+ \alpha \;=\; 1 - \frac{D_o}{D_e},
580+ \label{eq:appC-alpha}
581+\end{equation}
582+where $D_o$ is the mean difference between the values assigned to the same
583+unit by different coders and $D_e$ the mean difference between all pairs of
584+values in the pooled data, irrespective of unit. With two coders $A$ and $B$
585+rating each of $n$ units, the pooled set contains $N = 2n$ values and
586+\begin{equation}
587+ D_o \;=\; \frac{1}{n}\sum_{u=1}^{n} d\bigl(a_u, b_u\bigr), \qquad
588+ D_e \;=\; \frac{1}{N(N-1)}\sum_{c \ne c'} d\bigl(v_c, v_{c'}\bigr)
589+ \;=\; \frac{1}{\binom{N}{2}}\sum_{c < c'} d\bigl(v_c, v_{c'}\bigr),
590+ \label{eq:appC-DoDe}
591+\end{equation}
592+the second equality using the symmetry of $d$. The coefficient is one when
593+the coders agree on every unit ($D_o = 0$), zero when the within-unit
594+differences are what chance pairing of the pooled values would produce
595+($D_o = D_e$), and negative when disagreement is systematic. Unlike Cohen's
596+$\kappa$, which compares observed agreement with the product of the two
597+coders' marginals, $\alpha$ pools the two coders' values into one
598+distribution for its chance term, so it does not reward coders for having
599+different marginal distributions; this and its accommodation of arbitrary
600+difference functions are the reasons it is the recommended coefficient for
601+set-valued annotation \citep{artstein2008agreement}.
602+
603+\paragraph{The MASI distance.}
604+For set-valued labels $x, y \subseteq \mathcal{K}$, \citet{passonneau2006masi}
605+defines the Measuring Agreement on Set-valued Items distance as
606+\begin{gather}
607+ d_{\mathrm{MASI}}(x, y) \;=\; 1 - J(x, y)\, M(x, y), \qquad
608+ J(x, y) = \frac{|x \cap y|}{|x \cup y|}, \nonumber\\
609+ M(x, y) =
610+ \begin{cases}
611+ 1 & x = y,\\
612+ 2/3 & x \subsetneq y \text{ or } y \subsetneq x,\\
613+ 1/3 & x \cap y \ne \emptyset \text{ and neither contains the other},\\
614+ 0 & x \cap y = \emptyset ,
615+ \end{cases}
616+ \label{eq:appC-masi}
617+\end{gather}
618+the Jaccard similarity attenuated by a monotonicity factor that
619+distinguishes nesting from mere overlap. The distance is zero only for
620+identical non-empty sets, equals one for disjoint sets, and treats the pair
621+(empty, empty) as identical ($d = 0$) by the convention of the
622+implementation, which returns zero before computing $J$ for two empty sets;
623+the pair (empty, non-empty) has $J = 0$ and $d = 1$.
624+
625+\paragraph{What the code computes.}
626+\texttt{taxonomy/validate\_sample.py} forms, for the two raters, the
627+observed term as the mean of $d_{\mathrm{MASI}}^2$ over the $n$ rated works
628+and the expected term as the mean of $d_{\mathrm{MASI}}^2$ over all
629+unordered pairs of the $2n$ pooled label sets (exhaustively when
630+$2n \le 1200$, otherwise over 200{,}000 random ordered pairs with $i \ne j$,
631+seed 44), and reports $1 - D_o/D_e$. Two remarks make this precise. The code
632+uses the constants $0.67$ and $0.33$ for the monotonicity factor rather than
633+$2/3$ and $1/3$, a rounding of the published definition that changes
634+distances by at most $0.0034$. More consequentially, it \emph{squares} the
635+MASI distance before averaging, that is, it applies
636+\eqref{eq:appC-alpha}--\eqref{eq:appC-DoDe} with $d = d_{\mathrm{MASI}}^2$.
637+Krippendorff's interval metric is the squared difference, and the code's
638+comment describes the computation as the ``interval form on the MASI
639+distance''; \citeauthor{passonneau2006masi}, in contrast, plugs
640+$d_{\mathrm{MASI}}$ itself into the $\alpha$ formula, and the agreement
641+packages that implement MASI follow her. The two conventions yield different
642+numbers from the same ratings---squaring compresses small disagreements and
643+so, as a rule, raises $\alpha$ when most disagreements are partial---and the
644+value reported in Part~IX is the squared-distance version, labelled as such.
645+Both are legitimate instances of \eqref{eq:appC-alpha}; what is not
646+legitimate is to compare the reported value with published MASI-$\alpha$
647+figures without this caveat. The mean Jaccard index reported next to it is
648+$n^{-1}\sum_u J(a_u, b_u)$ with $0/0 = 0$ and is a raw agreement rate with
649+no chance correction. Both statistics are computed on the full rated sample
650+and not on the 200-work subsample reserved for the principal investigator,
651+whose verdicts will add a third coder to \eqref{eq:appC-DoDe} once
652+checkpoint H-2 is signed.
653+
654+\subsection{The multi-label score rule and the tie-break as a total order}
655+\label{sec:appC-score}
656+
657+\paragraph{Score.}
658+For a work $w$ and a category $k$ the implementation
659+(\texttt{taxonomy/classify.py}, \texttt{score\_row}) computes five
660+components, one per signal type $\sigma \in \{\mathrm{T}, \mathrm{F},
661+\mathrm{X}, \mathrm{D}, \mathrm{kw}\}$,
662+\begin{align}
663+ s^{\sigma}_k(w) &\;=\; \min\Bigl\{ 1,\ \sum_{x \in \sigma(w)} \omega^{\sigma}_k(x) \Bigr\}
664+ \qquad (\sigma \ne \mathrm{kw}), \\
665+ s^{\mathrm{kw}}_k(w) &\;=\; \min\Bigl\{ 1,\ \sum_{(r, \omega, \phi) \in R_k} \omega\, \mathbf{1}[r \text{ matches } \phi(w)] \Bigr\},
666+\end{align}
667+where $\sigma(w)$ is the \emph{set} of the work's topic, subfield, arXiv
668+category or DBLP stream identifiers (Python \texttt{set()}, so a repeated
669+identifier contributes once), and the keyword loop stops at the first rule
670+that brings the running sum to one, which is equivalent to the capped sum.
671+The score is $s_k(w) = \sum_\sigma s^{\sigma}_k(w) \in [0, 5]$; a category
672+with $s_k(w) \ge \theta = 1$ is then vetoed if any exclusion pattern of
673+$Z_k$ matches the concatenation of title and abstract, in which case its
674+score is set to zero and it is not assigned. The set of assigned categories
675+is $C(w) = \{k : s_k(w) \ge \theta,\ \text{not vetoed}\}$, and the stored
676+score of an assigned category is $s_k(w)$ rounded to three decimals. Two
677+elementary properties justify the reading given in Part~IV\@. The cap makes
678+each component a bounded, monotone, subadditive function of the matched
679+weights: adding a signal never lowers a component, and no number of signals
680+of one type can contribute more than one. And because the threshold equals
681+the cap, a single weight-one signal of any type suffices for assignment
682+while signals of weight below one require corroboration from a different
683+type; formally, $s_k(w) \ge 1$ holds if and only if either some component
684+reaches one or the sum of the (uncapped) components across at least two
685+types reaches one.
686+
687+\paragraph{Primary category as the minimum of a total order.}
688+Let $\mathcal{P}(w) = \bigcup_{k \in C(w)} \mathrm{parents}(k)$ be the set
689+of categories declared parents of at least one assigned category (the
690+\texttt{child\_of} relation of the ontology). The implementation sorts the
691+assigned categories by the key
692+\begin{equation}
693+ \phi(k) \;=\; \bigl( -s_k(w),\ \mathbf{1}[k \in \mathcal{P}(w)],\ \mathrm{number}(k) \bigr) \in \R \times \{0,1\} \times \mathbb{N}
694+ \label{eq:appC-key}
695+\end{equation}
696+in lexicographic order and takes the first element; this is
697+$\kappa^{\ast}(w) = \arg\min_{k \in C(w)} \phi(k)$ and coincides with the
698+lexicographic arg-max of Part~IV (the sign of the first component reversed).
699+The lexicographic order on $\R \times \{0,1\} \times \mathbb{N}$ is a total
700+order, and $\phi$ is injective on $\mathcal{K}$ because the ontology numbers
701+are distinct, so the restriction of $\phi$ to $C(w)$ has a unique minimum
702+whenever $C(w) \ne \emptyset$: the primary category is well defined and does
703+not depend on the order in which categories are scanned. The second
704+component implements ``child before parent'': if $k$ and $k'$ are both
705+assigned with equal scores and $k'$ is a declared parent of $k$, then
706+$k' \in \mathcal{P}(w)$ while $k$ may not be, and $k$ precedes $k'$. The rule
707+is not transitive in the sense of a hierarchy, however. Membership in
708+$\mathcal{P}(w)$ depends only on whether $k$ is the parent of \emph{some}
709+assigned category, not of the specific competitor; a category that is the
710+parent of a low-scoring assigned child is demoted in the tie against an
711+unrelated category of equal score. This is a property of the key as
712+implemented, stated here so that the primary counts of Part~IX are read with
713+it; it affects only exact ties in a score rounded to three decimals, which
714+are frequent precisely among the categories whose signals are weight-one
715+keywords. The third component, the ontology number, is arbitrary and makes
716+the order total; no claim is attached to it.
717+
718+\subsection{The emerging-topic label and the absence of look-ahead}
719+\label{sec:appC-lookahead}
720+
721+\paragraph{Filtrations.}
722+Index months by integers $t = 0, 1, \dots, M$ (January 2018 to the last
723+complete month) and let the panel of \texttt{experiments/emerging\_detection.py}
724+be the pair of arrays $n_{k,t}$ (eligible month-precision works of topic $k$
725+with first month $t$) and $c_{k,t}$ (internal citations received by works of
726+topic $k$ from works with first month $t$). Define the filtration
727+\begin{equation}
728+ \mathcal{F}_T \;=\; \sigma\bigl( n_{k,t},\ c_{k,t} :\ k \in \mathcal{K}_{\mathrm{top}},\ t \le T \bigr),
729+ \label{eq:appC-filtration}
730+\end{equation}
731+the information contained in the panel columns up to and including month
732+$T$. A statistic is \emph{available at} $T$ if it is
733+$\mathcal{F}_T$-measurable. Each of the six features of Part~IV is a
734+function of sums of panel entries over windows $(a, b]$ with $b \le T$:
735+$g^{12}_{k,T}$ uses $(T-24, T]$, $\mathrm{acc}_{k,T}$ uses $(T-36, T]$,
736+$z_{k,T}$ uses $[T-27, T]$, $\mathrm{cit}_{k,T}$ uses $(T-24, T]$ of $c$,
737+$\mathrm{share}_{k,T}$ uses $(T-12, T]$ of every topic, and
738+$\mathrm{age}_{k,T}$ uses the cumulative sum up to $T$. All are
739+$\mathcal{F}_T$-measurable by construction. The implementation enforces this
740+by index arithmetic (\texttt{win(a, lo, hi)} slices columns \texttt{lo+1}
741+to \texttt{hi} inclusive with \texttt{hi = T\_idx}), not by convention.
742+
743+\paragraph{Label.}
744+The label $\ell_{k,T,h}$ of equation~\eqref{eq:label} is a function of
745+$V_k(T-h, T]$, $V_k(T, T+h]$, $V_k(T-12, T]$ and of the within-cutoff decile
746+of $g^{\mathrm{fut}}$ over eligible topics; it is therefore
747+$\mathcal{F}_{T+h}$-measurable and, because it depends on columns strictly
748+after $T$, not $\mathcal{F}_T$-measurable. The feature--label pair at cutoff
749+$T$ thus has the structure of a prediction problem: predict an
750+$\mathcal{F}_{T+h}$-measurable outcome from an $\mathcal{F}_T$-measurable
751+input. The eligibility condition $V_k(T-12, T] \ge 20$ is
752+$\mathcal{F}_T$-measurable, so conditioning on it does not leak the outcome.
753+
754+\paragraph{Separation of training and test.}
755+Let $\mathcal{T}_{\mathrm{tr}}$ and $\mathcal{T}_{\mathrm{te}}$ be the
756+training and test cutoffs. Every quantity used to fit a model---features,
757+labels and the standardisation constants of the scaler, which is fitted on
758+training rows only---is $\mathcal{F}_{T^{\mathrm{tr}}_{\max} + h}$-measurable
759+with $T^{\mathrm{tr}}_{\max} = \max \mathcal{T}_{\mathrm{tr}}$. The
760+implementation sets $T^{\mathrm{tr}}_{\max}$ to December 2021 for $h = 12$
761+and to December 2020 for $h = 24$, so that $T^{\mathrm{tr}}_{\max} + h$ is
762+December 2022 in both cases, and the first test cutoff is January 2023.
763+Hence
764+\begin{equation}
765+ T^{\mathrm{tr}}_{\max} + h \;<\; \min \mathcal{T}_{\mathrm{te}},
766+ \label{eq:appC-gap}
767+\end{equation}
768+and the fitted predictor is measurable with respect to a $\sigma$-field
769+that precedes every test feature, let alone every test label, which closes
770+at $\max \mathcal{T}_{\mathrm{te}} + h \le M$. Condition \eqref{eq:appC-gap}
771+is the formal content of ``out of time'' in the sense of
772+\citet{bergmeir2012crossval}; it is stricter than the plan's wording, which
773+allowed training cutoffs through 2022, and stricter for $h = 24$ than the
774+description of Part~IV, which gives December 2021 as the last training
775+cutoff for both horizons---the code's rule is the one that guarantees
776+\eqref{eq:appC-gap}, and the manuscript follows the code. The test cutoffs
777+are further restricted to those with $T + h \le M$, so that no test label is
778+right-censored.
779+
780+\paragraph{What measurability does not cover.}
781+The filtration \eqref{eq:appC-filtration} is generated by the panel, and the
782+panel is built once, in 2026, from a corpus whose topic assignments,
783+eligibility flags, linkage and month-precision filter were all fixed with
784+knowledge of the whole period. Formally, the random objects $n_{k,t}$
785+themselves are not $\mathcal{F}_t$-measurable functionals of the literature
786+as it stood at $t$: they are functionals of the literature as OpenAlex
787+indexed and classified it by October 2026. The statement proved above is
788+therefore conditional: \emph{given} the 2026 panel, no feature at $T$ uses a
789+column after $T$ and no training quantity uses a column at or after the
790+first test cutoff. It is not the statement that an observer in 2021 could
791+have computed the training set, which would require a topic vocabulary and a
792+corpus frozen in 2021. Part~IV draws the distinction and names the
793+cluster-based extension that would narrow it; the derivation here makes
794+precise which half of the claim is proved and which is assumed.
modified manuscript/references_appBC.bib +1 −1
@@ -4,7 +4,7 @@
4 % are reused and never redefined here. 4 % are reused and never redefined here.
5 5
6 @article{jackson2005optimal, 6 @article{jackson2005optimal,
7− author = {Jackson, Brad and Scargle, Jeffrey D. and Barnes, David and Arabhi, Sundararajan and Alt, Alina and Gioumousis, Peter and Gwin, Elyus and Sangtrakulcharoen, Paungkaew and Tan, Linda and Tsai, Tun Tao}, 7+ author = {Jackson, B. and Scargle, J. D. and Barnes, D. and Arabhi, S. and Alt, A. and Gioumousis, P. and Gwin, E. and others},
8 title = {An algorithm for optimal partitioning of data on an interval}, 8 title = {An algorithm for optimal partitioning of data on an interval},
9 journal = {IEEE Signal Processing Letters}, 9 journal = {IEEE Signal Processing Letters},
10 year = {2005}, 10 year = {2005},
modified manuscript/references_verification_appBC.csv +1 −1
@@ -1,5 +1,5 @@
1 key,doi_or_arxiv,verified_via,verified_title,match 1 key,doi_or_arxiv,verified_via,verified_title,match
2−jackson2005optimal,10.1109/LSP.2001.838216,crossref,An algorithm for optimal partitioning of data on an interval,yes 2+jackson2005optimal,10.1109/LSP.2001.838216,crossref+openalex W2097880821,An algorithm for optimal partitioning of data on an interval,yes (authors 8-10 given as 'P. San; L. Tan; Tun Tao Tsai' in both records; entry lists the first seven verified names and 'others')
3 lorenz1905concentration,10.1080/15225437.1905.10503443,crossref,Methods of Measuring the Concentration of Wealth,yes 3 lorenz1905concentration,10.1080/15225437.1905.10503443,crossref,Methods of Measuring the Concentration of Wealth,yes
4 passonneau2006masi,10.63317/4nuo6thi27ax,crossref+openalex W1747645360,Measuring Agreement on Set-valued Items (MASI) for Semantic and Pragmatic Annotation,yes 4 passonneau2006masi,10.63317/4nuo6thi27ax,crossref+openalex W1747645360,Measuring Agreement on Set-valued Items (MASI) for Semantic and Pragmatic Annotation,yes
5 artstein2008agreement,10.1162/coli.07-034-R2,crossref,Inter-Coder Agreement for Computational Linguistics,yes 5 artstein2008agreement,10.1162/coli.07-034-R2,crossref,Inter-Coder Agreement for Computational Linguistics,yes
modified manuscript/sections/part04_methodology.tex +17 −8
@@ -521,10 +521,11 @@ the works to which rater $r$ assigned primary $k$; $\kappa$ is computed between
521 the two raters and between the rules and each rater. Agreement on the label 521 the two raters and between the rules and each rater. Agreement on the label
522 sets is measured by the mean Jaccard index 522 sets is measured by the mean Jaccard index
523 $\bar J = n^{-1}\sum_w |C^{A}(w) \cap C^{B}(w)| / |C^{A}(w) \cup C^{B}(w)|$ 523 $\bar J = n^{-1}\sum_w |C^{A}(w) \cap C^{B}(w)| / |C^{A}(w) \cup C^{B}(w)|$
524−(with the convention $0/0 = 0$). The validation note announces Krippendorff's 524+(with the convention $0/0 = 0$), and by Krippendorff's $\alpha$ with the
525−$\alpha$ with the MASI distance for the multi-label agreement; the metrics 525+MASI distance of \citet{passonneau2006masi} between the two raters' label
526−script computes the mean Jaccard index instead, and the manuscript reports 526+sets, in its interval form ($\alpha = 1 - D_o/D_e$ with squared MASI
527−what is computed. A work is exported as a disagreement for human review when 527+distances, $D_o$ the mean observed distance over works and $D_e$ the mean
528+distance over all pairs of label sets); the derivation is in Appendix~C. A work is exported as a disagreement for human review when
528 the rules, rater~A and rater~B have no category in common although at least 529 the rules, rater~A and rater~B have no category in common although at least
529 one of them assigned one. 530 one of them assigned one.
530 531
@@ -767,7 +768,12 @@ pipeline computes the category flow matrices from which $p$ is formed
767 (Section~\ref{sec:m-networks}) and the centroid similarities, but the two 768 (Section~\ref{sec:m-networks}) and the centroid similarities, but the two
768 diversity indices are not yet produced by a script; they are defined here 769 diversity indices are not yet produced by a script; they are defined here
769 because the protocol commits to them, and their values in Part IX are 770 because the protocol commits to them, and their values in Part IX are
770−\pending{Rao--Stirling and Leinster--Cobbold indices per category and period, not yet computed} 771+The yearly Rao--Stirling and Leinster--Cobbold indices of the category mix,
772+with bootstrap intervals from multinomial resampling of works over categories
773+($B = 500$, seed 44), are computed by \texttt{bibliometrics/04\_diversity\_cagr.py}
774+and reported in Part~IX; the dissimilarity $d_{ij}$ is one minus the cosine
775+similarity of category centroids when embeddings are available and one minus
776+the co-classification Jaccard similarity otherwise.
771 until the computation is added and audited. 777 until the computation is added and audited.
772 778
773 \section{Citation and collaboration networks} 779 \section{Citation and collaboration networks}
@@ -1370,7 +1376,9 @@ positives separately.
1370 1376
1371 \subsection{Cutoffs, models and metrics} 1377 \subsection{Cutoffs, models and metrics}
1372 1378
1373−Training cutoffs are every third month from December 2019 to December 2021; 1379+Training cutoffs are every third month from December 2019 to December 2021
1380+for the 12-month horizon and to December 2020 for the 24-month horizon, so
1381+that every training label is observable before the first test cutoff;
1374 test cutoffs are every third month from January 2023 to October 2024 for 1382 test cutoffs are every third month from January 2023 to October 2024 for
1375 which $T + h$ lies within the panel. With $h = 24$ the last training label 1383 which $T + h$ lies within the panel. With $h = 24$ the last training label
1376 uses data to December 2023, which is after the reference date but more than a 1384 uses data to December 2023, which is after the reference date but more than a
@@ -1385,8 +1393,9 @@ above with non-finite values replaced by zero.
1385 1393
1386 Three predictors are compared: the $z$-score baseline, which ranks topics by 1394 Three predictors are compared: the $z$-score baseline, which ranks topics by
1387 $z_{k,T}$ alone and involves no fitting; an $\ell_2$-regularised logistic 1395 $z_{k,T}$ alone and involves no fitting; an $\ell_2$-regularised logistic
1388−regression (regularisation strength $C = 1$, on unstandardised features, so 1396+regression (regularisation strength $C = 1$, on features standardised with a
1389−the penalty is not scale-invariant and acts most on the small-range features); 1397+scaler fitted on the training cutoffs only, so that the penalty is
1398+scale-invariant and no test-period statistic enters the fit);
1390 and a gradient boosting classifier \citep{friedman2001gbm} with 300 trees of 1399 and a gradient boosting classifier \citep{friedman2001gbm} with 300 trees of
1391 depth three and learning rate 0.05, seed 44, as implemented in scikit-learn 1400 depth three and learning rate 0.05, seed 44, as implemented in scikit-learn
1392 \citep{pedregosa2011sklearn}. The metrics on the pooled test rows are the area 1401 \citep{pedregosa2011sklearn}. The metrics on the pooled test rows are the area
modified manuscript/tables/numbers.tex +15 −0
@@ -106,3 +106,18 @@
106 \newcommand{\LinkSlimTotal}{464{,}765{,}485} 106 \newcommand{\LinkSlimTotal}{464{,}765{,}485}
107 \newcommand{\LinkSlimCsAnyTwoZeroOneEightTwoZeroTwoSix}{15{,}490{,}159} 107 \newcommand{\LinkSlimCsAnyTwoZeroOneEightTwoZeroTwoSix}{15{,}490{,}159}
108 \newcommand{\LinkSeconds}{10} 108 \newcommand{\LinkSeconds}{10}
109+\newcommand{\DblpParsedRecords}{8{,}840{,}866}
110+\newcommand{\DblpTypeIncollection}{71{,}247}
111+\newcommand{\DblpTypeBook}{21{,}648}
112+\newcommand{\DblpTypeProceedings}{65{,}792}
113+\newcommand{\DblpTypeMastersthesis}{27}
114+\newcommand{\DblpTypeData}{30{,}631}
115+\newcommand{\DblpTypeArticle}{4{,}500{,}501}
116+\newcommand{\DblpTypeInproceedings}{3{,}995{,}530}
117+\newcommand{\DblpTypePhdthesis}{158{,}398}
118+\newcommand{\AclParsedEntries}{138{,}796}
119+\newcommand{\IncrementApiCalls}{1{,}002}
120+\newcommand{\IncrementRecordsRetrieved}{193{,}369}
121+\newcommand{\IncrementTruncatedSlices}{1}
122+\newcommand{\IncrementSlicesDone}{64}
123+\newcommand{\IncrementCostUsd}{0.100}
modified tables/make_numbers.py +13 −0
@@ -43,5 +43,18 @@ for f, key in [("results/econometrics/its_results.json", "its"), ("taxonomy/vali
43 if os.path.exists(p): 43 if os.path.exists(p):
44 d = json.load(open(p)) 44 d = json.load(open(p))
45 walk(key, {k: v for k, v in d.items() if not isinstance(v, (list,))}) 45 walk(key, {k: v for k, v in d.items() if not isinstance(v, (list,))})
46+for f, key in [("data/metadata/dblp_parse_report.json", "dblp"), ("data/metadata/acl_parse_report.json", "acl"), ("data/metadata/api_increment_ledger.json", "increment"), ("data/metadata/increment_report.json", "incrementIngest")]:
47+ p = os.path.join(R, f)
48+ if os.path.exists(p):
49+ d = json.load(open(p))
50+ if key == "increment":
51+ sl = d.get("slices", {}); emit("increment api calls", d.get("calls", 0)); emit("increment records retrieved", sum(v.get("records", 0) for v in sl.values()))
52+ emit("increment truncated slices", sum(1 for v in sl.values() if v.get("truncated"))); emit("increment slices done", sum(1 for v in sl.values() if v.get("done"))); emit("increment cost usd", round(d.get("cost_usd_total", 0), 4))
53+ elif key == "incrementIngest":
54+ emit("increment new works", d.get("new_works", 0)); emit("increment already in snapshot", d.get("already_in_snapshot", 0))
55+ elif key == "dblp":
56+ emit("dblp parsed records", d.get("rows_written", 0)); [emit(f"dblp type {k}", v) for k, v in d.get("counts_by_type", {}).items()]
57+ elif key == "acl":
58+ emit("acl parsed entries", d.get("entries", 0))
46 open(os.path.join(R, "manuscript/tables/numbers.tex"), "w").write("% machine-generated by tables/make_numbers.py — do not edit\n" + "\n".join(out) + "\n") 59 open(os.path.join(R, "manuscript/tables/numbers.tex"), "w").write("% machine-generated by tables/make_numbers.py — do not edit\n" + "\n".join(out) + "\n")
47 print(len(out), "macros") 60 print(len(out), "macros")
48 61
Menu

Theme