Zum Hauptinhalt springen
clawam tools
Werkzeuge Dokumente Daoark EN Startseite Startseite / Calculadora › Startseite manifest.json 0; }).map(function(x) { return parseFloat(x); }).filter(function(x) { return !isNaN(x); }); } function mean(arr) { return arr.reduce(function(s, x) { return s + x; }, 0) / arr.length; } function variance(arr) { var m = mean(arr); return arr.reduce(function(s, x) { return s + (x - m) * (x - m); }, 0) / (arr.length - 1); } // log Γ(x) (Stirling/Lanczos) function logGamma(x) { var g = 7; var c = [0.99999999999980993, 676.5203681218851, -1259.1392167224028, 771.32342877765313, -176.61502916214059, 12.507343278686905, -0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7]; if (x < 0.5) return Math.log(Math.PI / Math.sin(Math.PI * x)) - logGamma(1 - x); x -= 1; var a = c[0]; var t = x + g + 0.5; for (var i = 1; i < g + 2; i++) a += c[i] / (x + i); return 0.5 * Math.log(2 * Math.PI) + (x + 0.5) * Math.log(t) - t + Math.log(a); } // 不完整 beta function betacf(a, b, x) { var EPS = 1e-10, FPMIN = 1e-30; var qab = a + b, qap = a + 1, qam = a - 1; var c = 1, d = 1 - qab * x / qap; if (Math.abs(d) < FPMIN) d = FPMIN; d = 1 / d; var h = d; for (var m = 1; m <= 200; m++) { var m2 = 2 * m; var aa = m * (b - m) * x / ((qam + m2) * (a + m2)); d = 1 + aa * d; if (Math.abs(d) < FPMIN) d = FPMIN; c = 1 + aa / c; if (Math.abs(c) < FPMIN) c = FPMIN; d = 1 / d; h *= d * c; aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2)); d = 1 + aa * d; if (Math.abs(d) < FPMIN) d = FPMIN; c = 1 + aa / c; if (Math.abs(c) < FPMIN) c = FPMIN; d = 1 / d; var del = d * c; h *= del; if (Math.abs(del - 1) < EPS) break; } return h; } function incompleteBeta(x, a, b) { if (x < 0 || x > 1) return NaN; if (x === 0 || x === 1) return x; var bt = Math.exp(logGamma(a + b) - logGamma(a) - logGamma(b) + a * Math.log(x) + b * Math.log(1 - x)); if (x < (a + 1) / (a + b + 2)) return bt * betacf(a, b, x) / a; return 1 - bt * betacf(b, a, 1 - x) / b; } // p-value for t 分布(双尾) function tDistTwoTailP(t, df) { if (df <= 0) return NaN; var x = df / (df + t * t); return incompleteBeta(x, df / 2, 0.5); } function tDistOneTailP(t, df) { return 0.5 * tDistTwoTailP(t, df); } function doProcess() { try { var op = getVal('op'); var alpha = parseFloat(getVal('alpha')); var tails = parseInt(getVal('tails'), 10); var a = parseNums(getVal('text-a')); if (a.length < 2) { showError('样本 A 至少 2 个数据'); return; } var t, df, p; var out = ''; if (op === 'one') { var mu0 = parseFloat(getVal('mu0')); var m = mean(a), s2 = variance(a), n = a.length; var se = Math.sqrt(s2 / n); t = (m - mu0) / se; df = n - 1; } else { var b = parseNums(getVal('text-b')); if (b.length < 2) { showError('样本 B 至少 2 个数据'); return; } if (op === 'paired') { if (a.length !== b.length) { showError('配对样本需等长 (A=' + a.length + ', B=' + b.length + ')'); return; } var d = []; for (var i = 0; i < a.length; i++) d.push(a[i] - b[i]); var dm = mean(d), ds2 = variance(d); t = dm / Math.sqrt(ds2 / d.length); df = d.length - 1; } else { // Welch var m1 = mean(a), m2 = mean(b); var v1 = variance(a), v2 = variance(b); var n1 = a.length, n2 = b.length; var se = Math.sqrt(v1 / n1 + v2 / n2); t = (m1 - m2) / se; df = Math.pow(v1 / n1 + v2 / n2, 2) / (Math.pow(v1 / n1, 2) / (n1 - 1) + Math.pow(v2 / n2, 2) / (n2 - 1)); } } p = tails === 2 ? tDistTwoTailP(t, df) : tDistOneTailP(t, df); var crit = tails === 2 ? 1.96 : 1.645; if (df < 30) crit = tails === 2 ? 2.045 : 1.699; var sig = p < alpha ? '拒绝 H₀' : '不拒绝 H₀'; out = 't = ' + t.toFixed(4) + '\n' + 'df = ' + df.toFixed(2) + '\n' + 'p = ' + p.toFixed(6) + (p < 1e-4 ? ' (< 0.0001)' : '') + '\n' + '临界值(参考) ≈ ±' + crit + '\n' + 'α = ' + alpha + '\n' + '结论: ' + sig + ' (p ' + (p < alpha ? '<' : '≥') + ' α)'; showResult(out, op + ', n_A=' + a.length + (op !== 'one' ? ', n_B=' + parseNums(getVal('text-b')).length : '')); } catch (e) { showError('计算失败: ' + (e.message || e)); } } $('btn-main').addEventListener('click', function(e) { e.preventDefault(); doProcess(); }); $('btn-clear').addEventListener('click', function() { var inputs = document.querySelectorAll('input,textarea,select'); for (var i = 0; i < inputs.length; i++) { if (inputs[i].tagName === 'SELECT') inputs[i].selectedIndex = 0; else inputs[i].value = inputs[i].defaultValue; } var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; }); })();