Add proof of prop 2
This commit is contained in:
434
index.html
434
index.html
@@ -26325,7 +26325,7 @@ w_{t,k}^{\text{Naive}} = \frac{1}{K}\label{eq:naive_combination}
|
||||
<section id="crps-learning-optimality" class="slide level2">
|
||||
<h2>CRPS Learning Optimality</h2>
|
||||
<div class="panel-tabset">
|
||||
<ul id="tabset-2" class="panel-tabset-tabby"><li><a data-tabby-default href="#tabset-2-1">Almost Optimal Convergence</a></li><li><a href="#tabset-2-2">Proposition + Conditions</a></li><li><a href="#tabset-2-3">Proposition + Theorem</a></li></ul>
|
||||
<ul id="tabset-2" class="panel-tabset-tabby"><li><a data-tabby-default href="#tabset-2-1">Almost Optimal Convergence</a></li><li><a href="#tabset-2-2">Proposition 1 + Conditions</a></li><li><a href="#tabset-2-3">Proposition 2 + Theorem</a></li><li><a href="#tabset-2-4">Proof of P2</a></li></ul>
|
||||
<div class="tab-content">
|
||||
<div id="tabset-2-1">
|
||||
<div style="font-size: 85%;">
|
||||
@@ -26405,6 +26405,60 @@ w_{t,k}^{\text{Naive}} = \frac{1}{K}\label{eq:naive_combination}
|
||||
<p><i class="fa fa-fw fa-check-double" style="color:var(--col_green_9);"></i> BOAG with <span class="math inline">\(\text{QL}\)</span> satisfies <span class="math inline">\(\eqref{eq_boa_opt_conv}\)</span> and <span class="math inline">\(\eqref{eq_boa_opt_select}\)</span></p>
|
||||
</div></div>
|
||||
</div>
|
||||
<div id="tabset-2-4">
|
||||
<div style="font-size: 85%;">
|
||||
<div class="columns">
|
||||
<div class="column" style="width:48%;">
|
||||
<p>First, rewrite <span class="math inline">\(QL_p\)</span> using the check function:</p>
|
||||
<p><span class="math display">\[\begin{align}
|
||||
\rho_p(z) = z(1(0 < z) - p) \label{eq:check}
|
||||
\end{align}\]</span></p>
|
||||
<p><span class="math display">\[\begin{align}
|
||||
QL_p(x, y) &= (\mathbf1(y < x) - p)(x - y) \\
|
||||
&= \rho_p(x-y)
|
||||
\end{align}\]</span></p>
|
||||
<p>Now we can express the quantile risk as:</p>
|
||||
<p><span class="math display">\[\begin{align}
|
||||
\mathcal{Q}_p(x) = E[\rho_p(x-y)] = ∫ \rho_p(x-y)f(y)dy
|
||||
\end{align}\]</span></p>
|
||||
<p>This integral form is where the convolution becomes apparent. A convolution of functions is defined as:</p>
|
||||
<p><span class="math display">\[\begin{align}
|
||||
(g * h)(x) &= ∫ g(z)h(x - z)dz \\
|
||||
&= ∫ h(x - z)g(z)dz
|
||||
\end{align}\]</span></p>
|
||||
<p>They are commutative.</p>
|
||||
</div><div class="column" style="width:4%;">
|
||||
|
||||
</div><div class="column" style="width:48%;">
|
||||
<p>Using exchangability of subgradients in covolutions:</p>
|
||||
<p><span class="math display">\[\begin{align}
|
||||
\mathcal{Q}''_p(x) = \rho_p'' * f
|
||||
\end{align}\]</span></p>
|
||||
<p>To find <span class="math inline">\(\mathcal{Q}''_p(x)\)</span> we rewrite <span class="math inline">\(\eqref{eq:check}\)</span>:</p>
|
||||
<p><span class="math display">\[\begin{align}
|
||||
\rho_p(z) &=
|
||||
\begin{cases}
|
||||
z(1 - p) = z - zp, & \text{if } z > 0 \\
|
||||
z(0 - p) = -zp, & \text{if } z \leq 0
|
||||
\end{cases} \\
|
||||
\rho_p'(z) &=
|
||||
\begin{cases}
|
||||
1 - p, & \text{if } z > 0 \\
|
||||
-p, & \text{if } z < 0
|
||||
\end{cases}
|
||||
\end{align}\]</span></p>
|
||||
<p>The function <span class="math inline">\(\rho'_p(z)\)</span> jumps from <span class="math inline">\(-p\)</span> to <span class="math inline">\(1-p\)</span> at <span class="math inline">\(0\)</span>. So:</p>
|
||||
<p><span class="math display">\[\begin{align}
|
||||
\rho''_p(x) = \delta_0(z) \quad \text{Dirac Delta}
|
||||
\end{align}\]</span></p>
|
||||
<p>Now the magical part <i class="fa fa-fw fa-wand-magic-sparkles" style="color:var(--col_amber_6);"></i>:</p>
|
||||
<p><span class="math display">\[\begin{align}
|
||||
\mathcal{Q}''_p(x) = \delta_0 * f = f
|
||||
\end{align}\]</span></p>
|
||||
<p>Because Dirac Delta is the identity element for convolutions.</p>
|
||||
</div></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -27233,7 +27287,7 @@ Y_{t} = \mu + Y_{t-1} + \varepsilon_t \quad \text{with} \quad \varepsilon_t = \
|
||||
<div class="tab-content">
|
||||
<div id="tabset-12-1">
|
||||
<div class="cell">
|
||||
<div class="sourceCode cell-code hidden" id="cb5" data-startfrom="2659" data-source-offset="0"><pre class="sourceCode numberSource js number-lines code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 2658;"><span id="cb5-2659"><a href></a>bsplineData <span class="op">=</span> <span class="fu">FileAttachment</span>(<span class="st">"assets/mcrps_learning/basis_functions.csv"</span>)<span class="op">.</span><span class="fu">csv</span>({ <span class="dt">typed</span><span class="op">:</span> <span class="kw">true</span> })</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
|
||||
<div class="sourceCode cell-code hidden" id="cb5" data-startfrom="2742" data-source-offset="0"><pre class="sourceCode numberSource js number-lines code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 2741;"><span id="cb5-2742"><a href></a>bsplineData <span class="op">=</span> <span class="fu">FileAttachment</span>(<span class="st">"assets/mcrps_learning/basis_functions.csv"</span>)<span class="op">.</span><span class="fu">csv</span>({ <span class="dt">typed</span><span class="op">:</span> <span class="kw">true</span> })</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
|
||||
<div class="cell-output cell-output-display">
|
||||
<div id="ojs-cell-4" data-nodetype="declaration">
|
||||
|
||||
@@ -27241,194 +27295,194 @@ Y_{t} = \mu + Y_{t-1} + \varepsilon_t \quad \text{with} \quad \varepsilon_t = \
|
||||
</div>
|
||||
</div>
|
||||
<div class="cell">
|
||||
<div class="sourceCode cell-code hidden" id="cb6" data-startfrom="2663" data-source-offset="0"><pre class="sourceCode numberSource js number-lines code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 2662;"><span id="cb6-2663"><a href></a><span class="co">// Defined above</span></span>
|
||||
<span id="cb6-2664"><a href></a><span class="co">// function updateChartInner(g, x, y, linesGroup, color, line, data) {</span></span>
|
||||
<span id="cb6-2665"><a href></a><span class="co">// // Update axes with transitions</span></span>
|
||||
<span id="cb6-2666"><a href></a><span class="co">// x.domain([0, d3.max(data, d => d.x)]);</span></span>
|
||||
<span id="cb6-2667"><a href></a><span class="co">// g.select(".x-axis").transition().duration(1500).call(d3.axisBottom(x).ticks(10));</span></span>
|
||||
<span id="cb6-2668"><a href></a><span class="co">// y.domain([0, d3.max(data, d => d.y)]);</span></span>
|
||||
<span id="cb6-2669"><a href></a><span class="co">// g.select(".y-axis").transition().duration(1500).call(d3.axisLeft(y).ticks(5));</span></span>
|
||||
<span id="cb6-2670"><a href></a></span>
|
||||
<span id="cb6-2671"><a href></a><span class="co">// // Group data by basis function</span></span>
|
||||
<span id="cb6-2672"><a href></a><span class="co">// const dataByFunction = Array.from(d3.group(data, d => d.b));</span></span>
|
||||
<span id="cb6-2673"><a href></a><span class="co">// const keyFn = d => d[0];</span></span>
|
||||
<span id="cb6-2674"><a href></a></span>
|
||||
<span id="cb6-2675"><a href></a><span class="co">// // Update basis function lines</span></span>
|
||||
<span id="cb6-2676"><a href></a><span class="co">// const u = linesGroup.selectAll("path").data(dataByFunction, keyFn);</span></span>
|
||||
<span id="cb6-2677"><a href></a><span class="co">// u.join(</span></span>
|
||||
<span id="cb6-2678"><a href></a><span class="co">// enter => enter.append("path").attr("fill","none").attr("stroke-width",3)</span></span>
|
||||
<span id="cb6-2679"><a href></a><span class="co">// .attr("stroke", (_, i) => color(i)).attr("d", d => line(d[1].map(pt => ({x: pt.x, y: 0}))))</span></span>
|
||||
<span id="cb6-2680"><a href></a><span class="co">// .style("opacity",0),</span></span>
|
||||
<span id="cb6-2681"><a href></a><span class="co">// update => update,</span></span>
|
||||
<span id="cb6-2682"><a href></a><span class="co">// exit => exit.transition().duration(1000).style("opacity",0).remove()</span></span>
|
||||
<span id="cb6-2683"><a href></a><span class="co">// )</span></span>
|
||||
<span id="cb6-2684"><a href></a><span class="co">// .transition().duration(1000)</span></span>
|
||||
<span id="cb6-2685"><a href></a><span class="co">// .attr("d", d => line(d[1]))</span></span>
|
||||
<span id="cb6-2686"><a href></a><span class="co">// .attr("stroke", (_, i) => color(i))</span></span>
|
||||
<span id="cb6-2687"><a href></a><span class="co">// .style("opacity",1);</span></span>
|
||||
<span id="cb6-2688"><a href></a><span class="co">// }</span></span>
|
||||
<span id="cb6-2689"><a href></a></span>
|
||||
<span id="cb6-2690"><a href></a>chart0 <span class="op">=</span> {</span>
|
||||
<span id="cb6-2691"><a href></a> <span class="co">// State variables for selected parameters</span></span>
|
||||
<span id="cb6-2692"><a href></a> <span class="kw">let</span> selectedMu <span class="op">=</span> <span class="fl">0.5</span><span class="op">;</span></span>
|
||||
<span id="cb6-2693"><a href></a> <span class="kw">let</span> selectedSig <span class="op">=</span> <span class="dv">1</span><span class="op">;</span></span>
|
||||
<span id="cb6-2694"><a href></a> <span class="kw">let</span> selectedNonc <span class="op">=</span> <span class="dv">0</span><span class="op">;</span></span>
|
||||
<span id="cb6-2695"><a href></a> <span class="kw">let</span> selectedTailw <span class="op">=</span> <span class="dv">1</span><span class="op">;</span></span>
|
||||
<span id="cb6-2696"><a href></a> <span class="kw">const</span> filteredData <span class="op">=</span> () <span class="kw">=></span> bsplineData<span class="op">.</span><span class="fu">filter</span>(d <span class="kw">=></span></span>
|
||||
<span id="cb6-2697"><a href></a> <span class="bu">Math</span><span class="op">.</span><span class="fu">abs</span>(selectedMu <span class="op">-</span> d<span class="op">.</span><span class="at">mu</span>) <span class="op"><</span> <span class="fl">0.001</span> <span class="op">&&</span></span>
|
||||
<span id="cb6-2698"><a href></a> d<span class="op">.</span><span class="at">sig</span> <span class="op">===</span> selectedSig <span class="op">&&</span></span>
|
||||
<span id="cb6-2699"><a href></a> d<span class="op">.</span><span class="at">nonc</span> <span class="op">===</span> selectedNonc <span class="op">&&</span></span>
|
||||
<span id="cb6-2700"><a href></a> d<span class="op">.</span><span class="at">tailw</span> <span class="op">===</span> selectedTailw</span>
|
||||
<span id="cb6-2701"><a href></a> )<span class="op">;</span></span>
|
||||
<span id="cb6-2702"><a href></a> <span class="kw">const</span> container <span class="op">=</span> d3<span class="op">.</span><span class="fu">create</span>(<span class="st">"div"</span>)</span>
|
||||
<span id="cb6-2703"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"max-width"</span><span class="op">,</span> <span class="st">"none"</span>)</span>
|
||||
<span id="cb6-2704"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"width"</span><span class="op">,</span> <span class="st">"100%"</span>)<span class="op">;;</span></span>
|
||||
<span id="cb6-2705"><a href></a> <span class="kw">const</span> controlsContainer <span class="op">=</span> container<span class="op">.</span><span class="fu">append</span>(<span class="st">"div"</span>)</span>
|
||||
<span id="cb6-2706"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"display"</span><span class="op">,</span> <span class="st">"flex"</span>)</span>
|
||||
<span id="cb6-2707"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"gap"</span><span class="op">,</span> <span class="st">"20px"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2708"><a href></a> <span class="co">// slider controls</span></span>
|
||||
<span id="cb6-2709"><a href></a> <span class="kw">const</span> sliders <span class="op">=</span> [</span>
|
||||
<span id="cb6-2710"><a href></a> { <span class="dt">label</span><span class="op">:</span> <span class="st">'Mu'</span><span class="op">,</span> <span class="kw">get</span><span class="op">:</span> () <span class="kw">=></span> selectedMu<span class="op">,</span> <span class="kw">set</span><span class="op">:</span> v <span class="kw">=></span> selectedMu <span class="op">=</span> v<span class="op">,</span> <span class="dt">min</span><span class="op">:</span> <span class="fl">0.1</span><span class="op">,</span> <span class="dt">max</span><span class="op">:</span> <span class="fl">0.9</span><span class="op">,</span> <span class="dt">step</span><span class="op">:</span> <span class="fl">0.2</span> }<span class="op">,</span></span>
|
||||
<span id="cb6-2711"><a href></a> { <span class="dt">label</span><span class="op">:</span> <span class="st">'Sigma'</span><span class="op">,</span> <span class="kw">get</span><span class="op">:</span> () <span class="kw">=></span> <span class="bu">Math</span><span class="op">.</span><span class="fu">log2</span>(selectedSig)<span class="op">,</span> <span class="kw">set</span><span class="op">:</span> v <span class="kw">=></span> selectedSig <span class="op">=</span> <span class="dv">2</span> <span class="op">**</span> v<span class="op">,</span> <span class="dt">min</span><span class="op">:</span> <span class="op">-</span><span class="dv">2</span><span class="op">,</span> <span class="dt">max</span><span class="op">:</span> <span class="dv">2</span><span class="op">,</span> <span class="dt">step</span><span class="op">:</span> <span class="dv">1</span> }<span class="op">,</span></span>
|
||||
<span id="cb6-2712"><a href></a> { <span class="dt">label</span><span class="op">:</span> <span class="st">'Noncentrality'</span><span class="op">,</span> <span class="kw">get</span><span class="op">:</span> () <span class="kw">=></span> selectedNonc<span class="op">,</span> <span class="kw">set</span><span class="op">:</span> v <span class="kw">=></span> selectedNonc <span class="op">=</span> v<span class="op">,</span> <span class="dt">min</span><span class="op">:</span> <span class="op">-</span><span class="dv">4</span><span class="op">,</span> <span class="dt">max</span><span class="op">:</span> <span class="dv">4</span><span class="op">,</span> <span class="dt">step</span><span class="op">:</span> <span class="dv">2</span> }<span class="op">,</span></span>
|
||||
<span id="cb6-2713"><a href></a> { <span class="dt">label</span><span class="op">:</span> <span class="st">'Tailweight'</span><span class="op">,</span> <span class="kw">get</span><span class="op">:</span> () <span class="kw">=></span> <span class="bu">Math</span><span class="op">.</span><span class="fu">log2</span>(selectedTailw)<span class="op">,</span> <span class="kw">set</span><span class="op">:</span> v <span class="kw">=></span> selectedTailw <span class="op">=</span> <span class="dv">2</span> <span class="op">**</span> v<span class="op">,</span> <span class="dt">min</span><span class="op">:</span> <span class="op">-</span><span class="dv">2</span><span class="op">,</span> <span class="dt">max</span><span class="op">:</span> <span class="dv">2</span><span class="op">,</span> <span class="dt">step</span><span class="op">:</span> <span class="dv">1</span> }</span>
|
||||
<span id="cb6-2714"><a href></a> ]<span class="op">;</span></span>
|
||||
<span id="cb6-2715"><a href></a> <span class="co">// Build slider controls with D3 data join</span></span>
|
||||
<span id="cb6-2716"><a href></a> <span class="kw">const</span> sliderCont <span class="op">=</span> controlsContainer<span class="op">.</span><span class="fu">selectAll</span>(<span class="st">'div'</span>)<span class="op">.</span><span class="fu">data</span>(sliders)<span class="op">.</span><span class="fu">join</span>(<span class="st">'div'</span>)</span>
|
||||
<span id="cb6-2717"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'display'</span><span class="op">,</span><span class="st">'flex'</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">'align-items'</span><span class="op">,</span><span class="st">'center'</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">'gap'</span><span class="op">,</span><span class="st">'10px'</span>)</span>
|
||||
<span id="cb6-2718"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'flex'</span><span class="op">,</span><span class="st">'1'</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">'min-width'</span><span class="op">,</span><span class="st">'0px'</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2719"><a href></a> sliderCont<span class="op">.</span><span class="fu">append</span>(<span class="st">'label'</span>)<span class="op">.</span><span class="fu">text</span>(d <span class="kw">=></span> d<span class="op">.</span><span class="at">label</span> <span class="op">+</span> <span class="st">':'</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">'font-size'</span><span class="op">,</span><span class="st">'20px'</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2720"><a href></a> sliderCont<span class="op">.</span><span class="fu">append</span>(<span class="st">'input'</span>)</span>
|
||||
<span id="cb6-2721"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">'type'</span><span class="op">,</span><span class="st">'range'</span>)<span class="op">.</span><span class="fu">attr</span>(<span class="st">'min'</span><span class="op">,</span> d <span class="kw">=></span> d<span class="op">.</span><span class="at">min</span>)<span class="op">.</span><span class="fu">attr</span>(<span class="st">'max'</span><span class="op">,</span> d <span class="kw">=></span> d<span class="op">.</span><span class="at">max</span>)<span class="op">.</span><span class="fu">attr</span>(<span class="st">'step'</span><span class="op">,</span> d <span class="kw">=></span> d<span class="op">.</span><span class="at">step</span>)</span>
|
||||
<span id="cb6-2722"><a href></a> <span class="op">.</span><span class="fu">property</span>(<span class="st">'value'</span><span class="op">,</span> d <span class="kw">=></span> d<span class="op">.</span><span class="fu">get</span>())</span>
|
||||
<span id="cb6-2723"><a href></a> <span class="op">.</span><span class="fu">on</span>(<span class="st">'input'</span><span class="op">,</span> <span class="kw">function</span>(<span class="bu">event</span><span class="op">,</span> d) {</span>
|
||||
<span id="cb6-2724"><a href></a> <span class="kw">const</span> val <span class="op">=</span> <span class="op">+</span><span class="kw">this</span><span class="op">.</span><span class="at">value</span><span class="op">;</span> d<span class="op">.</span><span class="fu">set</span>(val)<span class="op">;</span></span>
|
||||
<span id="cb6-2725"><a href></a> d3<span class="op">.</span><span class="fu">select</span>(<span class="kw">this</span><span class="op">.</span><span class="at">parentNode</span>)<span class="op">.</span><span class="fu">select</span>(<span class="st">'span'</span>)<span class="op">.</span><span class="fu">text</span>(d<span class="op">.</span><span class="at">label</span><span class="op">.</span><span class="fu">match</span>(<span class="ss">/Sigma</span><span class="sc">|</span><span class="ss">Tailweight/</span>) <span class="op">?</span> <span class="dv">2</span><span class="op">**</span>val <span class="op">:</span> val)<span class="op">;</span></span>
|
||||
<span id="cb6-2726"><a href></a> <span class="fu">updateChart</span>(<span class="fu">filteredData</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2727"><a href></a> })</span>
|
||||
<span id="cb6-2728"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'width'</span><span class="op">,</span> <span class="st">'100%'</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2729"><a href></a> sliderCont<span class="op">.</span><span class="fu">append</span>(<span class="st">'span'</span>)<span class="op">.</span><span class="fu">text</span>(d <span class="kw">=></span> (d<span class="op">.</span><span class="at">label</span><span class="op">.</span><span class="fu">match</span>(<span class="ss">/Sigma</span><span class="sc">|</span><span class="ss">Tailweight/</span>) <span class="op">?</span> d<span class="op">.</span><span class="fu">get</span>() <span class="op">:</span> d<span class="op">.</span><span class="fu">get</span>()))</span>
|
||||
<span id="cb6-2730"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'font-size'</span><span class="op">,</span><span class="st">'20px'</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2731"><a href></a> </span>
|
||||
<span id="cb6-2732"><a href></a> <span class="co">// Add Reset button to clear all sliders to their defaults</span></span>
|
||||
<span id="cb6-2733"><a href></a> controlsContainer<span class="op">.</span><span class="fu">append</span>(<span class="st">'button'</span>)</span>
|
||||
<span id="cb6-2734"><a href></a> <span class="op">.</span><span class="fu">text</span>(<span class="st">'Reset'</span>)</span>
|
||||
<span id="cb6-2735"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'font-size'</span><span class="op">,</span> <span class="st">'20px'</span>)</span>
|
||||
<span id="cb6-2736"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'align-self'</span><span class="op">,</span> <span class="st">'center'</span>)</span>
|
||||
<span id="cb6-2737"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'margin-left'</span><span class="op">,</span> <span class="st">'auto'</span>)</span>
|
||||
<span id="cb6-2738"><a href></a> <span class="op">.</span><span class="fu">on</span>(<span class="st">'click'</span><span class="op">,</span> () <span class="kw">=></span> {</span>
|
||||
<span id="cb6-2739"><a href></a> <span class="co">// reset state vars</span></span>
|
||||
<span id="cb6-2740"><a href></a> selectedMu <span class="op">=</span> <span class="fl">0.5</span><span class="op">;</span></span>
|
||||
<span id="cb6-2741"><a href></a> selectedSig <span class="op">=</span> <span class="dv">1</span><span class="op">;</span></span>
|
||||
<span id="cb6-2742"><a href></a> selectedNonc <span class="op">=</span> <span class="dv">0</span><span class="op">;</span></span>
|
||||
<span id="cb6-2743"><a href></a> selectedTailw <span class="op">=</span> <span class="dv">1</span><span class="op">;</span></span>
|
||||
<span id="cb6-2744"><a href></a> <span class="co">// update input positions</span></span>
|
||||
<span id="cb6-2745"><a href></a> sliderCont<span class="op">.</span><span class="fu">selectAll</span>(<span class="st">'input'</span>)<span class="op">.</span><span class="fu">property</span>(<span class="st">'value'</span><span class="op">,</span> d <span class="kw">=></span> d<span class="op">.</span><span class="fu">get</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2746"><a href></a> <span class="co">// update displayed labels</span></span>
|
||||
<span id="cb6-2747"><a href></a> sliderCont<span class="op">.</span><span class="fu">selectAll</span>(<span class="st">'span'</span>)</span>
|
||||
<span id="cb6-2748"><a href></a> <span class="op">.</span><span class="fu">text</span>(d <span class="kw">=></span> d<span class="op">.</span><span class="at">label</span><span class="op">.</span><span class="fu">match</span>(<span class="ss">/Sigma</span><span class="sc">|</span><span class="ss">Tailweight/</span>) <span class="op">?</span> (<span class="dv">2</span><span class="op">**</span>d<span class="op">.</span><span class="fu">get</span>()) <span class="op">:</span> d<span class="op">.</span><span class="fu">get</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2749"><a href></a> <span class="co">// redraw chart</span></span>
|
||||
<span id="cb6-2750"><a href></a> <span class="fu">updateChart</span>(<span class="fu">filteredData</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2751"><a href></a> })<span class="op">;</span></span>
|
||||
<span id="cb6-2752"><a href></a></span>
|
||||
<span id="cb6-2753"><a href></a> <span class="co">// Build SVG</span></span>
|
||||
<span id="cb6-2754"><a href></a> <span class="kw">const</span> width <span class="op">=</span> <span class="dv">1200</span><span class="op">;</span></span>
|
||||
<span id="cb6-2755"><a href></a> <span class="kw">const</span> height <span class="op">=</span> <span class="dv">450</span><span class="op">;</span></span>
|
||||
<span id="cb6-2756"><a href></a> <span class="kw">const</span> margin <span class="op">=</span> {<span class="dt">top</span><span class="op">:</span> <span class="dv">40</span><span class="op">,</span> <span class="dt">right</span><span class="op">:</span> <span class="dv">20</span><span class="op">,</span> <span class="dt">bottom</span><span class="op">:</span> <span class="dv">40</span><span class="op">,</span> <span class="dt">left</span><span class="op">:</span> <span class="dv">40</span>}<span class="op">;</span></span>
|
||||
<span id="cb6-2757"><a href></a> <span class="kw">const</span> innerWidth <span class="op">=</span> width <span class="op">-</span> margin<span class="op">.</span><span class="at">left</span> <span class="op">-</span> margin<span class="op">.</span><span class="at">right</span><span class="op">;</span></span>
|
||||
<span id="cb6-2758"><a href></a> <span class="kw">const</span> innerHeight <span class="op">=</span> height <span class="op">-</span> margin<span class="op">.</span><span class="at">top</span> <span class="op">-</span> margin<span class="op">.</span><span class="at">bottom</span><span class="op">;</span></span>
|
||||
<span id="cb6-2759"><a href></a></span>
|
||||
<span id="cb6-2760"><a href></a> <span class="co">// Set controls container width to match SVG plot width</span></span>
|
||||
<span id="cb6-2761"><a href></a> controlsContainer<span class="op">.</span><span class="fu">style</span>(<span class="st">"max-width"</span><span class="op">,</span> <span class="st">"none"</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">"width"</span><span class="op">,</span> <span class="st">"100%"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2762"><a href></a> <span class="co">// Distribute each control evenly and make sliders full-width</span></span>
|
||||
<span id="cb6-2763"><a href></a> controlsContainer<span class="op">.</span><span class="fu">selectAll</span>(<span class="st">"div"</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">"flex"</span><span class="op">,</span> <span class="st">"1"</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">"min-width"</span><span class="op">,</span> <span class="st">"0px"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2764"><a href></a> controlsContainer<span class="op">.</span><span class="fu">selectAll</span>(<span class="st">"input"</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">"width"</span><span class="op">,</span> <span class="st">"100%"</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">"box-sizing"</span><span class="op">,</span> <span class="st">"border-box"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2765"><a href></a> </span>
|
||||
<span id="cb6-2766"><a href></a> <span class="co">// Create scales</span></span>
|
||||
<span id="cb6-2767"><a href></a> <span class="kw">const</span> x <span class="op">=</span> d3<span class="op">.</span><span class="fu">scaleLinear</span>()</span>
|
||||
<span id="cb6-2768"><a href></a> <span class="op">.</span><span class="fu">domain</span>([<span class="dv">0</span><span class="op">,</span> <span class="dv">1</span>])</span>
|
||||
<span id="cb6-2769"><a href></a> <span class="op">.</span><span class="fu">range</span>([<span class="dv">0</span><span class="op">,</span> innerWidth])<span class="op">;</span></span>
|
||||
<span id="cb6-2770"><a href></a> </span>
|
||||
<span id="cb6-2771"><a href></a> <span class="kw">const</span> y <span class="op">=</span> d3<span class="op">.</span><span class="fu">scaleLinear</span>()</span>
|
||||
<span id="cb6-2772"><a href></a> <span class="op">.</span><span class="fu">domain</span>([<span class="dv">0</span><span class="op">,</span> <span class="dv">1</span>])</span>
|
||||
<span id="cb6-2773"><a href></a> <span class="op">.</span><span class="fu">range</span>([innerHeight<span class="op">,</span> <span class="dv">0</span>])<span class="op">;</span></span>
|
||||
<span id="cb6-2774"><a href></a> </span>
|
||||
<span id="cb6-2775"><a href></a> <span class="co">// Create a color scale for the basis functions</span></span>
|
||||
<span id="cb6-2776"><a href></a> <span class="kw">const</span> color <span class="op">=</span> d3<span class="op">.</span><span class="fu">scaleOrdinal</span>([<span class="st">"#9B26B0FF"</span><span class="op">,</span> <span class="st">"#3F51B4FF"</span><span class="op">,</span> <span class="st">"#02A9F3FF"</span><span class="op">,</span> <span class="st">"#009687FF"</span><span class="op">,</span> <span class="st">"#8BC34AFF"</span><span class="op">,</span> <span class="st">"#FFEB3AFF"</span><span class="op">,</span> <span class="st">"#FF9800FF"</span><span class="op">,</span> <span class="st">"#795447FF"</span>])<span class="op">;</span></span>
|
||||
<span id="cb6-2777"><a href></a> </span>
|
||||
<span id="cb6-2778"><a href></a> <span class="co">// Create SVG</span></span>
|
||||
<span id="cb6-2779"><a href></a> <span class="kw">const</span> svg <span class="op">=</span> d3<span class="op">.</span><span class="fu">create</span>(<span class="st">"svg"</span>)</span>
|
||||
<span id="cb6-2780"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"width"</span><span class="op">,</span> <span class="st">"100%"</span>)</span>
|
||||
<span id="cb6-2781"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"height"</span><span class="op">,</span> <span class="st">"auto"</span>)</span>
|
||||
<span id="cb6-2782"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"viewBox"</span><span class="op">,</span> [<span class="dv">0</span><span class="op">,</span> <span class="dv">0</span><span class="op">,</span> width<span class="op">,</span> height])</span>
|
||||
<span id="cb6-2783"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"preserveAspectRatio"</span><span class="op">,</span> <span class="st">"xMidYMid meet"</span>)</span>
|
||||
<span id="cb6-2784"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"style"</span><span class="op">,</span> <span class="st">"max-width: 100%; height: auto;"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2785"><a href></a> </span>
|
||||
<span id="cb6-2786"><a href></a> <span class="co">// Create the chart group</span></span>
|
||||
<span id="cb6-2787"><a href></a> <span class="kw">const</span> g <span class="op">=</span> svg<span class="op">.</span><span class="fu">append</span>(<span class="st">"g"</span>)</span>
|
||||
<span id="cb6-2788"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"transform"</span><span class="op">,</span> <span class="vs">`translate(</span><span class="sc">${</span>margin<span class="op">.</span><span class="at">left</span><span class="sc">}</span><span class="vs">,</span><span class="sc">${</span>margin<span class="op">.</span><span class="at">top</span><span class="sc">}</span><span class="vs">)`</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2789"><a href></a> </span>
|
||||
<span id="cb6-2790"><a href></a> <span class="co">// Add axes</span></span>
|
||||
<span id="cb6-2791"><a href></a> <span class="kw">const</span> xAxis <span class="op">=</span> g<span class="op">.</span><span class="fu">append</span>(<span class="st">"g"</span>)</span>
|
||||
<span id="cb6-2792"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"transform"</span><span class="op">,</span> <span class="vs">`translate(0,</span><span class="sc">${</span>innerHeight<span class="sc">}</span><span class="vs">)`</span>)</span>
|
||||
<span id="cb6-2793"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"class"</span><span class="op">,</span> <span class="st">"x-axis"</span>)</span>
|
||||
<span id="cb6-2794"><a href></a> <span class="op">.</span><span class="fu">call</span>(d3<span class="op">.</span><span class="fu">axisBottom</span>(x)<span class="op">.</span><span class="fu">ticks</span>(<span class="dv">10</span>))</span>
|
||||
<span id="cb6-2795"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"font-size"</span><span class="op">,</span> <span class="st">"20px"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2796"><a href></a> </span>
|
||||
<span id="cb6-2797"><a href></a> <span class="kw">const</span> yAxis <span class="op">=</span> g<span class="op">.</span><span class="fu">append</span>(<span class="st">"g"</span>)</span>
|
||||
<span id="cb6-2798"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"class"</span><span class="op">,</span> <span class="st">"y-axis"</span>)</span>
|
||||
<span id="cb6-2799"><a href></a> <span class="op">.</span><span class="fu">call</span>(d3<span class="op">.</span><span class="fu">axisLeft</span>(y)<span class="op">.</span><span class="fu">ticks</span>(<span class="dv">5</span>))</span>
|
||||
<span id="cb6-2800"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"font-size"</span><span class="op">,</span> <span class="st">"20px"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2801"><a href></a> </span>
|
||||
<span id="cb6-2802"><a href></a> <span class="co">// Add a horizontal line at y = 0</span></span>
|
||||
<span id="cb6-2803"><a href></a> g<span class="op">.</span><span class="fu">append</span>(<span class="st">"line"</span>)</span>
|
||||
<span id="cb6-2804"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"x1"</span><span class="op">,</span> <span class="dv">0</span>)</span>
|
||||
<span id="cb6-2805"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"x2"</span><span class="op">,</span> innerWidth)</span>
|
||||
<span id="cb6-2806"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"y1"</span><span class="op">,</span> <span class="fu">y</span>(<span class="dv">0</span>))</span>
|
||||
<span id="cb6-2807"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"y2"</span><span class="op">,</span> <span class="fu">y</span>(<span class="dv">0</span>))</span>
|
||||
<span id="cb6-2808"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"stroke"</span><span class="op">,</span> <span class="st">"#000"</span>)</span>
|
||||
<span id="cb6-2809"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"stroke-opacity"</span><span class="op">,</span> <span class="fl">0.2</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2810"><a href></a> </span>
|
||||
<span id="cb6-2811"><a href></a> <span class="co">// Add gridlines</span></span>
|
||||
<span id="cb6-2812"><a href></a> g<span class="op">.</span><span class="fu">append</span>(<span class="st">"g"</span>)</span>
|
||||
<span id="cb6-2813"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"class"</span><span class="op">,</span> <span class="st">"grid-lines"</span>)</span>
|
||||
<span id="cb6-2814"><a href></a> <span class="op">.</span><span class="fu">selectAll</span>(<span class="st">"line"</span>)</span>
|
||||
<span id="cb6-2815"><a href></a> <span class="op">.</span><span class="fu">data</span>(y<span class="op">.</span><span class="fu">ticks</span>(<span class="dv">5</span>))</span>
|
||||
<span id="cb6-2816"><a href></a> <span class="op">.</span><span class="fu">join</span>(<span class="st">"line"</span>)</span>
|
||||
<span id="cb6-2817"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"x1"</span><span class="op">,</span> <span class="dv">0</span>)</span>
|
||||
<span id="cb6-2818"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"x2"</span><span class="op">,</span> innerWidth)</span>
|
||||
<span id="cb6-2819"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"y1"</span><span class="op">,</span> d <span class="kw">=></span> <span class="fu">y</span>(d))</span>
|
||||
<span id="cb6-2820"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"y2"</span><span class="op">,</span> d <span class="kw">=></span> <span class="fu">y</span>(d))</span>
|
||||
<span id="cb6-2821"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"stroke"</span><span class="op">,</span> <span class="st">"#ccc"</span>)</span>
|
||||
<span id="cb6-2822"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"stroke-opacity"</span><span class="op">,</span> <span class="fl">0.5</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2823"><a href></a> </span>
|
||||
<span id="cb6-2824"><a href></a> <span class="co">// Create a line generator</span></span>
|
||||
<span id="cb6-2825"><a href></a> <span class="kw">const</span> line <span class="op">=</span> d3<span class="op">.</span><span class="fu">line</span>()</span>
|
||||
<span id="cb6-2826"><a href></a> <span class="op">.</span><span class="fu">x</span>(d <span class="kw">=></span> <span class="fu">x</span>(d<span class="op">.</span><span class="at">x</span>))</span>
|
||||
<span id="cb6-2827"><a href></a> <span class="op">.</span><span class="fu">y</span>(d <span class="kw">=></span> <span class="fu">y</span>(d<span class="op">.</span><span class="at">y</span>))</span>
|
||||
<span id="cb6-2828"><a href></a> <span class="op">.</span><span class="fu">curve</span>(d3<span class="op">.</span><span class="at">curveBasis</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2829"><a href></a> </span>
|
||||
<span id="cb6-2830"><a href></a> <span class="co">// Group to contain the basis function lines</span></span>
|
||||
<span id="cb6-2831"><a href></a> <span class="kw">const</span> linesGroup <span class="op">=</span> g<span class="op">.</span><span class="fu">append</span>(<span class="st">"g"</span>)</span>
|
||||
<span id="cb6-2832"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"class"</span><span class="op">,</span> <span class="st">"basis-functions"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2833"><a href></a> </span>
|
||||
<span id="cb6-2834"><a href></a> <span class="co">// Store the current basis functions for transition</span></span>
|
||||
<span id="cb6-2835"><a href></a> <span class="kw">let</span> currentBasisFunctions <span class="op">=</span> <span class="kw">new</span> <span class="bu">Map</span>()<span class="op">;</span></span>
|
||||
<span id="cb6-2836"><a href></a> </span>
|
||||
<span id="cb6-2837"><a href></a> <span class="co">// Function to update the chart with new data</span></span>
|
||||
<span id="cb6-2838"><a href></a> <span class="kw">function</span> <span class="fu">updateChart</span>(data) {</span>
|
||||
<span id="cb6-2839"><a href></a> <span class="fu">updateChartInner</span>(g<span class="op">,</span> x<span class="op">,</span> y<span class="op">,</span> linesGroup<span class="op">,</span> color<span class="op">,</span> line<span class="op">,</span> data)<span class="op">;</span></span>
|
||||
<span id="cb6-2840"><a href></a> }</span>
|
||||
<span id="cb6-2841"><a href></a> </span>
|
||||
<span id="cb6-2842"><a href></a> <span class="co">// Store the update function</span></span>
|
||||
<span id="cb6-2843"><a href></a> svg<span class="op">.</span><span class="fu">node</span>()<span class="op">.</span><span class="at">update</span> <span class="op">=</span> updateChart<span class="op">;</span></span>
|
||||
<span id="cb6-2844"><a href></a> </span>
|
||||
<span id="cb6-2845"><a href></a> <span class="co">// Initial render</span></span>
|
||||
<span id="cb6-2846"><a href></a> <span class="fu">updateChart</span>(<span class="fu">filteredData</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2847"><a href></a> </span>
|
||||
<span id="cb6-2848"><a href></a> container<span class="op">.</span><span class="fu">node</span>()<span class="op">.</span><span class="fu">appendChild</span>(svg<span class="op">.</span><span class="fu">node</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2849"><a href></a> <span class="cf">return</span> container<span class="op">.</span><span class="fu">node</span>()<span class="op">;</span></span>
|
||||
<span id="cb6-2850"><a href></a>}</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
|
||||
<div class="sourceCode cell-code hidden" id="cb6" data-startfrom="2746" data-source-offset="0"><pre class="sourceCode numberSource js number-lines code-with-copy"><code class="sourceCode javascript" style="counter-reset: source-line 2745;"><span id="cb6-2746"><a href></a><span class="co">// Defined above</span></span>
|
||||
<span id="cb6-2747"><a href></a><span class="co">// function updateChartInner(g, x, y, linesGroup, color, line, data) {</span></span>
|
||||
<span id="cb6-2748"><a href></a><span class="co">// // Update axes with transitions</span></span>
|
||||
<span id="cb6-2749"><a href></a><span class="co">// x.domain([0, d3.max(data, d => d.x)]);</span></span>
|
||||
<span id="cb6-2750"><a href></a><span class="co">// g.select(".x-axis").transition().duration(1500).call(d3.axisBottom(x).ticks(10));</span></span>
|
||||
<span id="cb6-2751"><a href></a><span class="co">// y.domain([0, d3.max(data, d => d.y)]);</span></span>
|
||||
<span id="cb6-2752"><a href></a><span class="co">// g.select(".y-axis").transition().duration(1500).call(d3.axisLeft(y).ticks(5));</span></span>
|
||||
<span id="cb6-2753"><a href></a></span>
|
||||
<span id="cb6-2754"><a href></a><span class="co">// // Group data by basis function</span></span>
|
||||
<span id="cb6-2755"><a href></a><span class="co">// const dataByFunction = Array.from(d3.group(data, d => d.b));</span></span>
|
||||
<span id="cb6-2756"><a href></a><span class="co">// const keyFn = d => d[0];</span></span>
|
||||
<span id="cb6-2757"><a href></a></span>
|
||||
<span id="cb6-2758"><a href></a><span class="co">// // Update basis function lines</span></span>
|
||||
<span id="cb6-2759"><a href></a><span class="co">// const u = linesGroup.selectAll("path").data(dataByFunction, keyFn);</span></span>
|
||||
<span id="cb6-2760"><a href></a><span class="co">// u.join(</span></span>
|
||||
<span id="cb6-2761"><a href></a><span class="co">// enter => enter.append("path").attr("fill","none").attr("stroke-width",3)</span></span>
|
||||
<span id="cb6-2762"><a href></a><span class="co">// .attr("stroke", (_, i) => color(i)).attr("d", d => line(d[1].map(pt => ({x: pt.x, y: 0}))))</span></span>
|
||||
<span id="cb6-2763"><a href></a><span class="co">// .style("opacity",0),</span></span>
|
||||
<span id="cb6-2764"><a href></a><span class="co">// update => update,</span></span>
|
||||
<span id="cb6-2765"><a href></a><span class="co">// exit => exit.transition().duration(1000).style("opacity",0).remove()</span></span>
|
||||
<span id="cb6-2766"><a href></a><span class="co">// )</span></span>
|
||||
<span id="cb6-2767"><a href></a><span class="co">// .transition().duration(1000)</span></span>
|
||||
<span id="cb6-2768"><a href></a><span class="co">// .attr("d", d => line(d[1]))</span></span>
|
||||
<span id="cb6-2769"><a href></a><span class="co">// .attr("stroke", (_, i) => color(i))</span></span>
|
||||
<span id="cb6-2770"><a href></a><span class="co">// .style("opacity",1);</span></span>
|
||||
<span id="cb6-2771"><a href></a><span class="co">// }</span></span>
|
||||
<span id="cb6-2772"><a href></a></span>
|
||||
<span id="cb6-2773"><a href></a>chart0 <span class="op">=</span> {</span>
|
||||
<span id="cb6-2774"><a href></a> <span class="co">// State variables for selected parameters</span></span>
|
||||
<span id="cb6-2775"><a href></a> <span class="kw">let</span> selectedMu <span class="op">=</span> <span class="fl">0.5</span><span class="op">;</span></span>
|
||||
<span id="cb6-2776"><a href></a> <span class="kw">let</span> selectedSig <span class="op">=</span> <span class="dv">1</span><span class="op">;</span></span>
|
||||
<span id="cb6-2777"><a href></a> <span class="kw">let</span> selectedNonc <span class="op">=</span> <span class="dv">0</span><span class="op">;</span></span>
|
||||
<span id="cb6-2778"><a href></a> <span class="kw">let</span> selectedTailw <span class="op">=</span> <span class="dv">1</span><span class="op">;</span></span>
|
||||
<span id="cb6-2779"><a href></a> <span class="kw">const</span> filteredData <span class="op">=</span> () <span class="kw">=></span> bsplineData<span class="op">.</span><span class="fu">filter</span>(d <span class="kw">=></span></span>
|
||||
<span id="cb6-2780"><a href></a> <span class="bu">Math</span><span class="op">.</span><span class="fu">abs</span>(selectedMu <span class="op">-</span> d<span class="op">.</span><span class="at">mu</span>) <span class="op"><</span> <span class="fl">0.001</span> <span class="op">&&</span></span>
|
||||
<span id="cb6-2781"><a href></a> d<span class="op">.</span><span class="at">sig</span> <span class="op">===</span> selectedSig <span class="op">&&</span></span>
|
||||
<span id="cb6-2782"><a href></a> d<span class="op">.</span><span class="at">nonc</span> <span class="op">===</span> selectedNonc <span class="op">&&</span></span>
|
||||
<span id="cb6-2783"><a href></a> d<span class="op">.</span><span class="at">tailw</span> <span class="op">===</span> selectedTailw</span>
|
||||
<span id="cb6-2784"><a href></a> )<span class="op">;</span></span>
|
||||
<span id="cb6-2785"><a href></a> <span class="kw">const</span> container <span class="op">=</span> d3<span class="op">.</span><span class="fu">create</span>(<span class="st">"div"</span>)</span>
|
||||
<span id="cb6-2786"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"max-width"</span><span class="op">,</span> <span class="st">"none"</span>)</span>
|
||||
<span id="cb6-2787"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"width"</span><span class="op">,</span> <span class="st">"100%"</span>)<span class="op">;;</span></span>
|
||||
<span id="cb6-2788"><a href></a> <span class="kw">const</span> controlsContainer <span class="op">=</span> container<span class="op">.</span><span class="fu">append</span>(<span class="st">"div"</span>)</span>
|
||||
<span id="cb6-2789"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"display"</span><span class="op">,</span> <span class="st">"flex"</span>)</span>
|
||||
<span id="cb6-2790"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"gap"</span><span class="op">,</span> <span class="st">"20px"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2791"><a href></a> <span class="co">// slider controls</span></span>
|
||||
<span id="cb6-2792"><a href></a> <span class="kw">const</span> sliders <span class="op">=</span> [</span>
|
||||
<span id="cb6-2793"><a href></a> { <span class="dt">label</span><span class="op">:</span> <span class="st">'Mu'</span><span class="op">,</span> <span class="kw">get</span><span class="op">:</span> () <span class="kw">=></span> selectedMu<span class="op">,</span> <span class="kw">set</span><span class="op">:</span> v <span class="kw">=></span> selectedMu <span class="op">=</span> v<span class="op">,</span> <span class="dt">min</span><span class="op">:</span> <span class="fl">0.1</span><span class="op">,</span> <span class="dt">max</span><span class="op">:</span> <span class="fl">0.9</span><span class="op">,</span> <span class="dt">step</span><span class="op">:</span> <span class="fl">0.2</span> }<span class="op">,</span></span>
|
||||
<span id="cb6-2794"><a href></a> { <span class="dt">label</span><span class="op">:</span> <span class="st">'Sigma'</span><span class="op">,</span> <span class="kw">get</span><span class="op">:</span> () <span class="kw">=></span> <span class="bu">Math</span><span class="op">.</span><span class="fu">log2</span>(selectedSig)<span class="op">,</span> <span class="kw">set</span><span class="op">:</span> v <span class="kw">=></span> selectedSig <span class="op">=</span> <span class="dv">2</span> <span class="op">**</span> v<span class="op">,</span> <span class="dt">min</span><span class="op">:</span> <span class="op">-</span><span class="dv">2</span><span class="op">,</span> <span class="dt">max</span><span class="op">:</span> <span class="dv">2</span><span class="op">,</span> <span class="dt">step</span><span class="op">:</span> <span class="dv">1</span> }<span class="op">,</span></span>
|
||||
<span id="cb6-2795"><a href></a> { <span class="dt">label</span><span class="op">:</span> <span class="st">'Noncentrality'</span><span class="op">,</span> <span class="kw">get</span><span class="op">:</span> () <span class="kw">=></span> selectedNonc<span class="op">,</span> <span class="kw">set</span><span class="op">:</span> v <span class="kw">=></span> selectedNonc <span class="op">=</span> v<span class="op">,</span> <span class="dt">min</span><span class="op">:</span> <span class="op">-</span><span class="dv">4</span><span class="op">,</span> <span class="dt">max</span><span class="op">:</span> <span class="dv">4</span><span class="op">,</span> <span class="dt">step</span><span class="op">:</span> <span class="dv">2</span> }<span class="op">,</span></span>
|
||||
<span id="cb6-2796"><a href></a> { <span class="dt">label</span><span class="op">:</span> <span class="st">'Tailweight'</span><span class="op">,</span> <span class="kw">get</span><span class="op">:</span> () <span class="kw">=></span> <span class="bu">Math</span><span class="op">.</span><span class="fu">log2</span>(selectedTailw)<span class="op">,</span> <span class="kw">set</span><span class="op">:</span> v <span class="kw">=></span> selectedTailw <span class="op">=</span> <span class="dv">2</span> <span class="op">**</span> v<span class="op">,</span> <span class="dt">min</span><span class="op">:</span> <span class="op">-</span><span class="dv">2</span><span class="op">,</span> <span class="dt">max</span><span class="op">:</span> <span class="dv">2</span><span class="op">,</span> <span class="dt">step</span><span class="op">:</span> <span class="dv">1</span> }</span>
|
||||
<span id="cb6-2797"><a href></a> ]<span class="op">;</span></span>
|
||||
<span id="cb6-2798"><a href></a> <span class="co">// Build slider controls with D3 data join</span></span>
|
||||
<span id="cb6-2799"><a href></a> <span class="kw">const</span> sliderCont <span class="op">=</span> controlsContainer<span class="op">.</span><span class="fu">selectAll</span>(<span class="st">'div'</span>)<span class="op">.</span><span class="fu">data</span>(sliders)<span class="op">.</span><span class="fu">join</span>(<span class="st">'div'</span>)</span>
|
||||
<span id="cb6-2800"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'display'</span><span class="op">,</span><span class="st">'flex'</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">'align-items'</span><span class="op">,</span><span class="st">'center'</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">'gap'</span><span class="op">,</span><span class="st">'10px'</span>)</span>
|
||||
<span id="cb6-2801"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'flex'</span><span class="op">,</span><span class="st">'1'</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">'min-width'</span><span class="op">,</span><span class="st">'0px'</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2802"><a href></a> sliderCont<span class="op">.</span><span class="fu">append</span>(<span class="st">'label'</span>)<span class="op">.</span><span class="fu">text</span>(d <span class="kw">=></span> d<span class="op">.</span><span class="at">label</span> <span class="op">+</span> <span class="st">':'</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">'font-size'</span><span class="op">,</span><span class="st">'20px'</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2803"><a href></a> sliderCont<span class="op">.</span><span class="fu">append</span>(<span class="st">'input'</span>)</span>
|
||||
<span id="cb6-2804"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">'type'</span><span class="op">,</span><span class="st">'range'</span>)<span class="op">.</span><span class="fu">attr</span>(<span class="st">'min'</span><span class="op">,</span> d <span class="kw">=></span> d<span class="op">.</span><span class="at">min</span>)<span class="op">.</span><span class="fu">attr</span>(<span class="st">'max'</span><span class="op">,</span> d <span class="kw">=></span> d<span class="op">.</span><span class="at">max</span>)<span class="op">.</span><span class="fu">attr</span>(<span class="st">'step'</span><span class="op">,</span> d <span class="kw">=></span> d<span class="op">.</span><span class="at">step</span>)</span>
|
||||
<span id="cb6-2805"><a href></a> <span class="op">.</span><span class="fu">property</span>(<span class="st">'value'</span><span class="op">,</span> d <span class="kw">=></span> d<span class="op">.</span><span class="fu">get</span>())</span>
|
||||
<span id="cb6-2806"><a href></a> <span class="op">.</span><span class="fu">on</span>(<span class="st">'input'</span><span class="op">,</span> <span class="kw">function</span>(<span class="bu">event</span><span class="op">,</span> d) {</span>
|
||||
<span id="cb6-2807"><a href></a> <span class="kw">const</span> val <span class="op">=</span> <span class="op">+</span><span class="kw">this</span><span class="op">.</span><span class="at">value</span><span class="op">;</span> d<span class="op">.</span><span class="fu">set</span>(val)<span class="op">;</span></span>
|
||||
<span id="cb6-2808"><a href></a> d3<span class="op">.</span><span class="fu">select</span>(<span class="kw">this</span><span class="op">.</span><span class="at">parentNode</span>)<span class="op">.</span><span class="fu">select</span>(<span class="st">'span'</span>)<span class="op">.</span><span class="fu">text</span>(d<span class="op">.</span><span class="at">label</span><span class="op">.</span><span class="fu">match</span>(<span class="ss">/Sigma</span><span class="sc">|</span><span class="ss">Tailweight/</span>) <span class="op">?</span> <span class="dv">2</span><span class="op">**</span>val <span class="op">:</span> val)<span class="op">;</span></span>
|
||||
<span id="cb6-2809"><a href></a> <span class="fu">updateChart</span>(<span class="fu">filteredData</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2810"><a href></a> })</span>
|
||||
<span id="cb6-2811"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'width'</span><span class="op">,</span> <span class="st">'100%'</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2812"><a href></a> sliderCont<span class="op">.</span><span class="fu">append</span>(<span class="st">'span'</span>)<span class="op">.</span><span class="fu">text</span>(d <span class="kw">=></span> (d<span class="op">.</span><span class="at">label</span><span class="op">.</span><span class="fu">match</span>(<span class="ss">/Sigma</span><span class="sc">|</span><span class="ss">Tailweight/</span>) <span class="op">?</span> d<span class="op">.</span><span class="fu">get</span>() <span class="op">:</span> d<span class="op">.</span><span class="fu">get</span>()))</span>
|
||||
<span id="cb6-2813"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'font-size'</span><span class="op">,</span><span class="st">'20px'</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2814"><a href></a> </span>
|
||||
<span id="cb6-2815"><a href></a> <span class="co">// Add Reset button to clear all sliders to their defaults</span></span>
|
||||
<span id="cb6-2816"><a href></a> controlsContainer<span class="op">.</span><span class="fu">append</span>(<span class="st">'button'</span>)</span>
|
||||
<span id="cb6-2817"><a href></a> <span class="op">.</span><span class="fu">text</span>(<span class="st">'Reset'</span>)</span>
|
||||
<span id="cb6-2818"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'font-size'</span><span class="op">,</span> <span class="st">'20px'</span>)</span>
|
||||
<span id="cb6-2819"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'align-self'</span><span class="op">,</span> <span class="st">'center'</span>)</span>
|
||||
<span id="cb6-2820"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">'margin-left'</span><span class="op">,</span> <span class="st">'auto'</span>)</span>
|
||||
<span id="cb6-2821"><a href></a> <span class="op">.</span><span class="fu">on</span>(<span class="st">'click'</span><span class="op">,</span> () <span class="kw">=></span> {</span>
|
||||
<span id="cb6-2822"><a href></a> <span class="co">// reset state vars</span></span>
|
||||
<span id="cb6-2823"><a href></a> selectedMu <span class="op">=</span> <span class="fl">0.5</span><span class="op">;</span></span>
|
||||
<span id="cb6-2824"><a href></a> selectedSig <span class="op">=</span> <span class="dv">1</span><span class="op">;</span></span>
|
||||
<span id="cb6-2825"><a href></a> selectedNonc <span class="op">=</span> <span class="dv">0</span><span class="op">;</span></span>
|
||||
<span id="cb6-2826"><a href></a> selectedTailw <span class="op">=</span> <span class="dv">1</span><span class="op">;</span></span>
|
||||
<span id="cb6-2827"><a href></a> <span class="co">// update input positions</span></span>
|
||||
<span id="cb6-2828"><a href></a> sliderCont<span class="op">.</span><span class="fu">selectAll</span>(<span class="st">'input'</span>)<span class="op">.</span><span class="fu">property</span>(<span class="st">'value'</span><span class="op">,</span> d <span class="kw">=></span> d<span class="op">.</span><span class="fu">get</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2829"><a href></a> <span class="co">// update displayed labels</span></span>
|
||||
<span id="cb6-2830"><a href></a> sliderCont<span class="op">.</span><span class="fu">selectAll</span>(<span class="st">'span'</span>)</span>
|
||||
<span id="cb6-2831"><a href></a> <span class="op">.</span><span class="fu">text</span>(d <span class="kw">=></span> d<span class="op">.</span><span class="at">label</span><span class="op">.</span><span class="fu">match</span>(<span class="ss">/Sigma</span><span class="sc">|</span><span class="ss">Tailweight/</span>) <span class="op">?</span> (<span class="dv">2</span><span class="op">**</span>d<span class="op">.</span><span class="fu">get</span>()) <span class="op">:</span> d<span class="op">.</span><span class="fu">get</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2832"><a href></a> <span class="co">// redraw chart</span></span>
|
||||
<span id="cb6-2833"><a href></a> <span class="fu">updateChart</span>(<span class="fu">filteredData</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2834"><a href></a> })<span class="op">;</span></span>
|
||||
<span id="cb6-2835"><a href></a></span>
|
||||
<span id="cb6-2836"><a href></a> <span class="co">// Build SVG</span></span>
|
||||
<span id="cb6-2837"><a href></a> <span class="kw">const</span> width <span class="op">=</span> <span class="dv">1200</span><span class="op">;</span></span>
|
||||
<span id="cb6-2838"><a href></a> <span class="kw">const</span> height <span class="op">=</span> <span class="dv">450</span><span class="op">;</span></span>
|
||||
<span id="cb6-2839"><a href></a> <span class="kw">const</span> margin <span class="op">=</span> {<span class="dt">top</span><span class="op">:</span> <span class="dv">40</span><span class="op">,</span> <span class="dt">right</span><span class="op">:</span> <span class="dv">20</span><span class="op">,</span> <span class="dt">bottom</span><span class="op">:</span> <span class="dv">40</span><span class="op">,</span> <span class="dt">left</span><span class="op">:</span> <span class="dv">40</span>}<span class="op">;</span></span>
|
||||
<span id="cb6-2840"><a href></a> <span class="kw">const</span> innerWidth <span class="op">=</span> width <span class="op">-</span> margin<span class="op">.</span><span class="at">left</span> <span class="op">-</span> margin<span class="op">.</span><span class="at">right</span><span class="op">;</span></span>
|
||||
<span id="cb6-2841"><a href></a> <span class="kw">const</span> innerHeight <span class="op">=</span> height <span class="op">-</span> margin<span class="op">.</span><span class="at">top</span> <span class="op">-</span> margin<span class="op">.</span><span class="at">bottom</span><span class="op">;</span></span>
|
||||
<span id="cb6-2842"><a href></a></span>
|
||||
<span id="cb6-2843"><a href></a> <span class="co">// Set controls container width to match SVG plot width</span></span>
|
||||
<span id="cb6-2844"><a href></a> controlsContainer<span class="op">.</span><span class="fu">style</span>(<span class="st">"max-width"</span><span class="op">,</span> <span class="st">"none"</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">"width"</span><span class="op">,</span> <span class="st">"100%"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2845"><a href></a> <span class="co">// Distribute each control evenly and make sliders full-width</span></span>
|
||||
<span id="cb6-2846"><a href></a> controlsContainer<span class="op">.</span><span class="fu">selectAll</span>(<span class="st">"div"</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">"flex"</span><span class="op">,</span> <span class="st">"1"</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">"min-width"</span><span class="op">,</span> <span class="st">"0px"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2847"><a href></a> controlsContainer<span class="op">.</span><span class="fu">selectAll</span>(<span class="st">"input"</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">"width"</span><span class="op">,</span> <span class="st">"100%"</span>)<span class="op">.</span><span class="fu">style</span>(<span class="st">"box-sizing"</span><span class="op">,</span> <span class="st">"border-box"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2848"><a href></a> </span>
|
||||
<span id="cb6-2849"><a href></a> <span class="co">// Create scales</span></span>
|
||||
<span id="cb6-2850"><a href></a> <span class="kw">const</span> x <span class="op">=</span> d3<span class="op">.</span><span class="fu">scaleLinear</span>()</span>
|
||||
<span id="cb6-2851"><a href></a> <span class="op">.</span><span class="fu">domain</span>([<span class="dv">0</span><span class="op">,</span> <span class="dv">1</span>])</span>
|
||||
<span id="cb6-2852"><a href></a> <span class="op">.</span><span class="fu">range</span>([<span class="dv">0</span><span class="op">,</span> innerWidth])<span class="op">;</span></span>
|
||||
<span id="cb6-2853"><a href></a> </span>
|
||||
<span id="cb6-2854"><a href></a> <span class="kw">const</span> y <span class="op">=</span> d3<span class="op">.</span><span class="fu">scaleLinear</span>()</span>
|
||||
<span id="cb6-2855"><a href></a> <span class="op">.</span><span class="fu">domain</span>([<span class="dv">0</span><span class="op">,</span> <span class="dv">1</span>])</span>
|
||||
<span id="cb6-2856"><a href></a> <span class="op">.</span><span class="fu">range</span>([innerHeight<span class="op">,</span> <span class="dv">0</span>])<span class="op">;</span></span>
|
||||
<span id="cb6-2857"><a href></a> </span>
|
||||
<span id="cb6-2858"><a href></a> <span class="co">// Create a color scale for the basis functions</span></span>
|
||||
<span id="cb6-2859"><a href></a> <span class="kw">const</span> color <span class="op">=</span> d3<span class="op">.</span><span class="fu">scaleOrdinal</span>([<span class="st">"#9B26B0FF"</span><span class="op">,</span> <span class="st">"#3F51B4FF"</span><span class="op">,</span> <span class="st">"#02A9F3FF"</span><span class="op">,</span> <span class="st">"#009687FF"</span><span class="op">,</span> <span class="st">"#8BC34AFF"</span><span class="op">,</span> <span class="st">"#FFEB3AFF"</span><span class="op">,</span> <span class="st">"#FF9800FF"</span><span class="op">,</span> <span class="st">"#795447FF"</span>])<span class="op">;</span></span>
|
||||
<span id="cb6-2860"><a href></a> </span>
|
||||
<span id="cb6-2861"><a href></a> <span class="co">// Create SVG</span></span>
|
||||
<span id="cb6-2862"><a href></a> <span class="kw">const</span> svg <span class="op">=</span> d3<span class="op">.</span><span class="fu">create</span>(<span class="st">"svg"</span>)</span>
|
||||
<span id="cb6-2863"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"width"</span><span class="op">,</span> <span class="st">"100%"</span>)</span>
|
||||
<span id="cb6-2864"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"height"</span><span class="op">,</span> <span class="st">"auto"</span>)</span>
|
||||
<span id="cb6-2865"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"viewBox"</span><span class="op">,</span> [<span class="dv">0</span><span class="op">,</span> <span class="dv">0</span><span class="op">,</span> width<span class="op">,</span> height])</span>
|
||||
<span id="cb6-2866"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"preserveAspectRatio"</span><span class="op">,</span> <span class="st">"xMidYMid meet"</span>)</span>
|
||||
<span id="cb6-2867"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"style"</span><span class="op">,</span> <span class="st">"max-width: 100%; height: auto;"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2868"><a href></a> </span>
|
||||
<span id="cb6-2869"><a href></a> <span class="co">// Create the chart group</span></span>
|
||||
<span id="cb6-2870"><a href></a> <span class="kw">const</span> g <span class="op">=</span> svg<span class="op">.</span><span class="fu">append</span>(<span class="st">"g"</span>)</span>
|
||||
<span id="cb6-2871"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"transform"</span><span class="op">,</span> <span class="vs">`translate(</span><span class="sc">${</span>margin<span class="op">.</span><span class="at">left</span><span class="sc">}</span><span class="vs">,</span><span class="sc">${</span>margin<span class="op">.</span><span class="at">top</span><span class="sc">}</span><span class="vs">)`</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2872"><a href></a> </span>
|
||||
<span id="cb6-2873"><a href></a> <span class="co">// Add axes</span></span>
|
||||
<span id="cb6-2874"><a href></a> <span class="kw">const</span> xAxis <span class="op">=</span> g<span class="op">.</span><span class="fu">append</span>(<span class="st">"g"</span>)</span>
|
||||
<span id="cb6-2875"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"transform"</span><span class="op">,</span> <span class="vs">`translate(0,</span><span class="sc">${</span>innerHeight<span class="sc">}</span><span class="vs">)`</span>)</span>
|
||||
<span id="cb6-2876"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"class"</span><span class="op">,</span> <span class="st">"x-axis"</span>)</span>
|
||||
<span id="cb6-2877"><a href></a> <span class="op">.</span><span class="fu">call</span>(d3<span class="op">.</span><span class="fu">axisBottom</span>(x)<span class="op">.</span><span class="fu">ticks</span>(<span class="dv">10</span>))</span>
|
||||
<span id="cb6-2878"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"font-size"</span><span class="op">,</span> <span class="st">"20px"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2879"><a href></a> </span>
|
||||
<span id="cb6-2880"><a href></a> <span class="kw">const</span> yAxis <span class="op">=</span> g<span class="op">.</span><span class="fu">append</span>(<span class="st">"g"</span>)</span>
|
||||
<span id="cb6-2881"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"class"</span><span class="op">,</span> <span class="st">"y-axis"</span>)</span>
|
||||
<span id="cb6-2882"><a href></a> <span class="op">.</span><span class="fu">call</span>(d3<span class="op">.</span><span class="fu">axisLeft</span>(y)<span class="op">.</span><span class="fu">ticks</span>(<span class="dv">5</span>))</span>
|
||||
<span id="cb6-2883"><a href></a> <span class="op">.</span><span class="fu">style</span>(<span class="st">"font-size"</span><span class="op">,</span> <span class="st">"20px"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2884"><a href></a> </span>
|
||||
<span id="cb6-2885"><a href></a> <span class="co">// Add a horizontal line at y = 0</span></span>
|
||||
<span id="cb6-2886"><a href></a> g<span class="op">.</span><span class="fu">append</span>(<span class="st">"line"</span>)</span>
|
||||
<span id="cb6-2887"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"x1"</span><span class="op">,</span> <span class="dv">0</span>)</span>
|
||||
<span id="cb6-2888"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"x2"</span><span class="op">,</span> innerWidth)</span>
|
||||
<span id="cb6-2889"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"y1"</span><span class="op">,</span> <span class="fu">y</span>(<span class="dv">0</span>))</span>
|
||||
<span id="cb6-2890"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"y2"</span><span class="op">,</span> <span class="fu">y</span>(<span class="dv">0</span>))</span>
|
||||
<span id="cb6-2891"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"stroke"</span><span class="op">,</span> <span class="st">"#000"</span>)</span>
|
||||
<span id="cb6-2892"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"stroke-opacity"</span><span class="op">,</span> <span class="fl">0.2</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2893"><a href></a> </span>
|
||||
<span id="cb6-2894"><a href></a> <span class="co">// Add gridlines</span></span>
|
||||
<span id="cb6-2895"><a href></a> g<span class="op">.</span><span class="fu">append</span>(<span class="st">"g"</span>)</span>
|
||||
<span id="cb6-2896"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"class"</span><span class="op">,</span> <span class="st">"grid-lines"</span>)</span>
|
||||
<span id="cb6-2897"><a href></a> <span class="op">.</span><span class="fu">selectAll</span>(<span class="st">"line"</span>)</span>
|
||||
<span id="cb6-2898"><a href></a> <span class="op">.</span><span class="fu">data</span>(y<span class="op">.</span><span class="fu">ticks</span>(<span class="dv">5</span>))</span>
|
||||
<span id="cb6-2899"><a href></a> <span class="op">.</span><span class="fu">join</span>(<span class="st">"line"</span>)</span>
|
||||
<span id="cb6-2900"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"x1"</span><span class="op">,</span> <span class="dv">0</span>)</span>
|
||||
<span id="cb6-2901"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"x2"</span><span class="op">,</span> innerWidth)</span>
|
||||
<span id="cb6-2902"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"y1"</span><span class="op">,</span> d <span class="kw">=></span> <span class="fu">y</span>(d))</span>
|
||||
<span id="cb6-2903"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"y2"</span><span class="op">,</span> d <span class="kw">=></span> <span class="fu">y</span>(d))</span>
|
||||
<span id="cb6-2904"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"stroke"</span><span class="op">,</span> <span class="st">"#ccc"</span>)</span>
|
||||
<span id="cb6-2905"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"stroke-opacity"</span><span class="op">,</span> <span class="fl">0.5</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2906"><a href></a> </span>
|
||||
<span id="cb6-2907"><a href></a> <span class="co">// Create a line generator</span></span>
|
||||
<span id="cb6-2908"><a href></a> <span class="kw">const</span> line <span class="op">=</span> d3<span class="op">.</span><span class="fu">line</span>()</span>
|
||||
<span id="cb6-2909"><a href></a> <span class="op">.</span><span class="fu">x</span>(d <span class="kw">=></span> <span class="fu">x</span>(d<span class="op">.</span><span class="at">x</span>))</span>
|
||||
<span id="cb6-2910"><a href></a> <span class="op">.</span><span class="fu">y</span>(d <span class="kw">=></span> <span class="fu">y</span>(d<span class="op">.</span><span class="at">y</span>))</span>
|
||||
<span id="cb6-2911"><a href></a> <span class="op">.</span><span class="fu">curve</span>(d3<span class="op">.</span><span class="at">curveBasis</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2912"><a href></a> </span>
|
||||
<span id="cb6-2913"><a href></a> <span class="co">// Group to contain the basis function lines</span></span>
|
||||
<span id="cb6-2914"><a href></a> <span class="kw">const</span> linesGroup <span class="op">=</span> g<span class="op">.</span><span class="fu">append</span>(<span class="st">"g"</span>)</span>
|
||||
<span id="cb6-2915"><a href></a> <span class="op">.</span><span class="fu">attr</span>(<span class="st">"class"</span><span class="op">,</span> <span class="st">"basis-functions"</span>)<span class="op">;</span></span>
|
||||
<span id="cb6-2916"><a href></a> </span>
|
||||
<span id="cb6-2917"><a href></a> <span class="co">// Store the current basis functions for transition</span></span>
|
||||
<span id="cb6-2918"><a href></a> <span class="kw">let</span> currentBasisFunctions <span class="op">=</span> <span class="kw">new</span> <span class="bu">Map</span>()<span class="op">;</span></span>
|
||||
<span id="cb6-2919"><a href></a> </span>
|
||||
<span id="cb6-2920"><a href></a> <span class="co">// Function to update the chart with new data</span></span>
|
||||
<span id="cb6-2921"><a href></a> <span class="kw">function</span> <span class="fu">updateChart</span>(data) {</span>
|
||||
<span id="cb6-2922"><a href></a> <span class="fu">updateChartInner</span>(g<span class="op">,</span> x<span class="op">,</span> y<span class="op">,</span> linesGroup<span class="op">,</span> color<span class="op">,</span> line<span class="op">,</span> data)<span class="op">;</span></span>
|
||||
<span id="cb6-2923"><a href></a> }</span>
|
||||
<span id="cb6-2924"><a href></a> </span>
|
||||
<span id="cb6-2925"><a href></a> <span class="co">// Store the update function</span></span>
|
||||
<span id="cb6-2926"><a href></a> svg<span class="op">.</span><span class="fu">node</span>()<span class="op">.</span><span class="at">update</span> <span class="op">=</span> updateChart<span class="op">;</span></span>
|
||||
<span id="cb6-2927"><a href></a> </span>
|
||||
<span id="cb6-2928"><a href></a> <span class="co">// Initial render</span></span>
|
||||
<span id="cb6-2929"><a href></a> <span class="fu">updateChart</span>(<span class="fu">filteredData</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2930"><a href></a> </span>
|
||||
<span id="cb6-2931"><a href></a> container<span class="op">.</span><span class="fu">node</span>()<span class="op">.</span><span class="fu">appendChild</span>(svg<span class="op">.</span><span class="fu">node</span>())<span class="op">;</span></span>
|
||||
<span id="cb6-2932"><a href></a> <span class="cf">return</span> container<span class="op">.</span><span class="fu">node</span>()<span class="op">;</span></span>
|
||||
<span id="cb6-2933"><a href></a>}</span></code><button title="Copy to Clipboard" class="code-copy-button"><i class="bi"></i></button></pre></div>
|
||||
<div class="cell-output cell-output-display">
|
||||
<div id="ojs-cell-5" data-nodetype="declaration">
|
||||
|
||||
|
||||
87
index.qmd
87
index.qmd
@@ -1297,7 +1297,7 @@ if the loss $\ell$ is $G$-Lipschitz and weak exp-concave in its first coordinate
|
||||
|
||||
:::
|
||||
|
||||
## Proposition + Conditions
|
||||
## Proposition 1 + Conditions
|
||||
|
||||
|
||||
:::: {.columns}
|
||||
@@ -1363,7 +1363,7 @@ The strongest case is $\beta=1$ (Strong Convexity)
|
||||
|
||||
::::
|
||||
|
||||
## Proposition + Theorem
|
||||
## Proposition 2 + Theorem
|
||||
|
||||
:::: {.columns}
|
||||
|
||||
@@ -1411,6 +1411,89 @@ $$\widehat{\mathcal{R}}_{t,\min} = 2\overline{\widehat{\mathcal{R}}}^{\text{QL}}
|
||||
|
||||
::::
|
||||
|
||||
## Proof of P2 {.scrollable}
|
||||
|
||||
::: {style="font-size: 85%;"}
|
||||
|
||||
:::: {.columns}
|
||||
|
||||
::: {.column width="48%"}
|
||||
|
||||
First, rewrite $QL_p$ using the check function:
|
||||
|
||||
\begin{align}
|
||||
\rho_p(z) = z(1(0 < z) - p) \label{eq:check}
|
||||
\end{align}
|
||||
|
||||
\begin{align}
|
||||
QL_p(x, y) &= (\mathbf1(y < x) - p)(x - y) \\
|
||||
&= \rho_p(x-y)
|
||||
\end{align}
|
||||
|
||||
Now we can express the quantile risk as:
|
||||
|
||||
\begin{align}
|
||||
\mathcal{Q}_p(x) = E[\rho_p(x-y)] = ∫ \rho_p(x-y)f(y)dy
|
||||
\end{align}
|
||||
|
||||
This integral form is where the convolution becomes apparent. A convolution of functions is defined as:
|
||||
|
||||
\begin{align}
|
||||
(g * h)(x) &= ∫ g(z)h(x - z)dz \\
|
||||
&= ∫ h(x - z)g(z)dz
|
||||
\end{align}
|
||||
|
||||
They are commutative.
|
||||
|
||||
:::
|
||||
|
||||
::: {.column width="4%"}
|
||||
|
||||
:::
|
||||
|
||||
::: {.column width="48%"}
|
||||
|
||||
Using exchangability of subgradients in covolutions:
|
||||
|
||||
\begin{align}
|
||||
\mathcal{Q}''_p(x) = \rho_p'' * f
|
||||
\end{align}
|
||||
|
||||
To find $\mathcal{Q}''_p(x)$ we rewrite \eqref{eq:check}:
|
||||
|
||||
\begin{align}
|
||||
\rho_p(z) &=
|
||||
\begin{cases}
|
||||
z(1 - p) = z - zp, & \text{if } z > 0 \\
|
||||
z(0 - p) = -zp, & \text{if } z \leq 0
|
||||
\end{cases} \\
|
||||
\rho_p'(z) &=
|
||||
\begin{cases}
|
||||
1 - p, & \text{if } z > 0 \\
|
||||
-p, & \text{if } z < 0
|
||||
\end{cases}
|
||||
\end{align}
|
||||
|
||||
The function $\rho'_p(z)$ jumps from $-p$ to $1-p$ at $0$. So:
|
||||
|
||||
\begin{align}
|
||||
\rho''_p(x) = \delta_0(z) \quad \text{Dirac Delta}
|
||||
\end{align}
|
||||
|
||||
Now the magical part <i class="fa fa-fw fa-wand-magic-sparkles" style="color:var(--col_amber_6);"></i>:
|
||||
|
||||
\begin{align}
|
||||
\mathcal{Q}''_p(x) = \delta_0 * f = f
|
||||
\end{align}
|
||||
|
||||
Because Dirac Delta is the identity element for convolutions.
|
||||
|
||||
:::
|
||||
|
||||
::::
|
||||
|
||||
::::
|
||||
|
||||
::::
|
||||
|
||||
## A Probabilistic Example
|
||||
|
||||
Reference in New Issue
Block a user