Unlisted
Edited
Jan 1, 2024
Insert cell
Insert cell
Insert cell
viewof input = Inputs.form({
n: Inputs.range([10, 1000], {value: 100, step: 1, label: "time series length"}),
sigmaeps: Inputs.range([0.1, 5], {value: 1, step: 0.1, label: tex`\sigma_\varepsilon`}),
sigmaalpha: Inputs.range([0.01, 2], {value: 1, step: 0.1, label: tex`\sigma_\alpha`}),
sigmabeta: Inputs.range([0.01, 2], {value: 1, step: 0.1, label: tex`\sigma_\beta`})
})
Insert cell
simulatedData
Type SQL, then Shift-Enter. Ctrl-space for more options.

Insert cell
viewof obsnumber = Inputs.range([1, n], {label: "show regline at time", step: 1})
Insert cell
viewof simulatebutton = Inputs.button("Simulate")
Insert cell
scatterplot = Plot.plot({
title: md`Darker points are closer to chosen time period <span style="color:#f28e2c">*t = *${obsnumber}</span>.`,
color: {
domain: [0,0.01/Math.log(n)],
scheme: "blues",
label: "Closeness in time to selected time period",
legend: false,
//transform: (f) => Math.pow(f,1)
},

marks:
[
Plot.ruleX([0]),
Plot.ruleY([d3.min(simulatedDataLocal.map(d => d.y))]),
Plot.line(
[
{x: 0, y: simulatedDataLocal[obsnumber-1].alpha + 0*simulatedDataLocal[obsnumber-1].beta},
{x: 2, y: simulatedDataLocal[obsnumber-1].alpha + 2*simulatedDataLocal[obsnumber-1].beta}
],
{x: "x", y: "y", stroke: "orange", strokeWidth: 2}
),
Plot.dot(simulatedDataLocal,
{x: "x", y: "y", fill: "weight", strokeWidth: 2}),
Plot.dot(simulatedDataLocal,
{x: "x", y: "y", stroke: "gray", strokeWidth: 0.3, r: 3}),
//Plot.dot([simulatedDataLocal[obsnumber-1]],
//{x: "x", y: "y", fill: "orange", stroke: "orange", strokeWidth: 5}),
Plot.tip(simulatedDataLocal, Plot.pointer({
x: "x",
y: "y",
title: (d) => ["time = ", d.time].join("")
}))
]
})
Insert cell
paramevolplot = Plot.plot({
title: md`Parameter evolution: <span style="color:#4682B4">α = ${simulatedData[obsnumber-1].alpha.toFixed(3)} </span> and <span style="color:#f28e2c">β = ${simulatedData[obsnumber-1].beta.toFixed(3)}</span> `,
y: {
label: "coefficients"
},
marks: [
Plot.ruleX([0]),
Plot.ruleY([d3.min(simulatedData.map(d => d3.min([d.alpha,d.beta])))]),
Plot.lineY(simulatedData, {x: "time", y: "alpha", stroke: "steelblue"}),
Plot.lineY(simulatedData, {x: "time", y: "beta", stroke: "orange"}),
Plot.dot([simulatedData[obsnumber-1]], {x: "time", y: "alpha", fill: "steelblue", stroke: "black", r: 4}),
Plot.dot([simulatedData[obsnumber-1]], {x: "time", y: "beta", fill: "orange", stroke: "black", r: 4}),
Plot.tip(simulatedData, Plot.pointer({
x: "time", y: "alpha",
title: (d) => ["α = ", d.alpha.toFixed(3)].join("")
})),
Plot.tip(simulatedData, Plot.pointer({
x: "time", y: "beta",
title: (d) => ["β = ", d.beta.toFixed(3)].join("")
}))
]
})
Insert cell
viewof sigma_bw = Inputs.range([.001, 0.3], {value: 0.1, label: "Color sensitivity", step: 0.001})
Insert cell
Insert cell
math = require("mathjs");
Insert cell
jStat = require("jstat");
Insert cell
n = input.n
Insert cell
Insert cell
function simLocalRegression(n, sigmaeps, sigmaalpha, sigmabeta) {

simulatebutton

const data = [];
let alpha = 0;
let beta = 0;
const x = d3.range(n).map(d => d3.randomUniform(0, 2)())

for (let t = 0; t < n; t++) {
alpha = alpha + sigmaalpha*d3.randomNormal()();
beta = beta + sigmabeta*d3.randomNormal()();
data.push({time: t + 1, y: alpha + beta*x[t] + sigmaeps*d3.randomNormal()(), x: x[t], alpha: alpha, beta: beta});
}

return data;
}
Insert cell
simulatedData = simLocalRegression(n, input.sigmaeps, input.sigmaalpha, input.sigmabeta)
Insert cell
function weightedData(obsnumber, sigma){

const localData = [];
let denseval = d3.range(n).map(t => jStat.normal.pdf(t, obsnumber-1, n*sigma))
const sumdenseval = d3.sum(denseval)
const weights = denseval.map(d => d/sumdenseval)
for (let t = 0; t < n; ++t) {
localData[t] = simulatedData[t]
localData[t].weight = weights[t]
}
return localData
}
Insert cell
simulatedDataLocal = weightedData(obsnumber, sigma_bw)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more