studiesData = {
const rows = await d3.csv("/studies/studies.csv");
return rows.map(d => ({
...d,
yearNum: +d.year || null,
stageList: (d.stages || "").split("|").filter(s => s),
recNum: +d.top_rec || 0
}));
}
stageMeta = ({
DM: {label: "Data management", chapters: "Ch. 3–4", note: "dm_note", accent: "#1f6feb"},
CR: {label: "Concept representation", chapters: "Ch. 5–6", note: "cr_note", accent: "#8250df"},
DA: {label: "Computational analysis", chapters: "Ch. 7–8", note: "da_note", accent: "#bc4c00"},
SC: {label: "Scientific communication", chapters: "Ch. 9–10", note: "sc_note", accent: "#1a7f37"}
})
// A lens is either fixed by the hub page or chosen by the reader. When fixed,
// show plain text instead of a disabled dropdown: a disabled control announces
// as "unavailable" to screen readers, which misdescribes a deliberate setting.
viewof chosenLens = stageLens === null
? Inputs.select(
new Map([
["All design stages", "ALL"],
...Object.entries(stageMeta).map(([k, v]) => [`${v.label} (${v.chapters})`, k])
]),
{label: "Design stage", value: "ALL"}
)
: Inputs.input(stageLens);
activeLens = stageLens === null ? chosenLens : stageLens
inScope = activeLens === "ALL"
? studiesData
: studiesData.filter(d => d.stageList.includes(activeLens))
viewof queryText = Inputs.text({
label: "Search",
placeholder: "title, journal, abstract, annotation…",
width: 320,
submit: false
})
viewof disciplinePick = Inputs.select(
["All disciplines", ...new Set(inScope.map(d => d.discipline).filter(x => x))].sort(
(a, b) => (a === "All disciplines" ? -1 : b === "All disciplines" ? 1 : a.localeCompare(b))
),
{label: "Discipline", value: "All disciplines"}
)
viewof recommendedOnly = Inputs.toggle({
label: "Recommended for at least one stage",
value: false
})
filtered = {
const q = (queryText || "").trim().toLowerCase();
return inScope
.filter(d => disciplinePick === "All disciplines" || d.discipline === disciplinePick)
.filter(d => !recommendedOnly || d.recNum >= 4)
.filter(d => {
if (!q) return true;
return [d.title, d.journal, d.abstract, d.discipline, d.theme,
d.dm_note, d.cr_note, d.da_note, d.sc_note]
.some(v => (v || "").toLowerCase().includes(q));
})
.sort((a, b) => (b.recNum - a.recNum) || (b.yearNum - a.yearNum));
}Chapter 7 — Computational analysis
Materials for the computational-methods Practice section
Materials for Chapter 7’s practice: separating what a computational method can do from what a study asks it to do, across the four epistemic purposes.
Chapter 7 separates what a computational method can do (iterate, model non-linear relationships, process high-dimensional data) from what a study is asking it to do: describe, explain, predict, or integrate.
The Practice assignment. Select one published study using network analysis, machine learning, word embeddings, or another method from this chapter. Write a one-page analysis of its epistemic purpose and computational capacities. Examine how it handles epistemic opacity, the semantics-to-application gap, and temporal dynamics. Assess whether its validation suits its purpose, and explain what you would change.
The studies, filtered to computational analysis
Sixty-four studies carry an annotation on their analytical approach.
Note
The computational capacity field in each study’s expandable detail uses the source table’s own vocabulary (simulation, iteration, prediction), which predates the one this chapter uses. Only iteration is shared by the two lists. Use the chapter’s three capacities for your assignment and explain your classification from the study’s methods.
Assessing the study’s design
Assess opacity, the semantics-to-application gap, and temporal dynamics through the checks a design makes possible. A study may test performance across time periods without using the phrase temporal drift. Explain what that check establishes and what remains uncertain, using the chapter’s concepts to interpret the evidence.