function showTab(tabId) { document.querySelectorAll('.tab-content').forEach(tab => { tab.classList.remove('active'); }); document.querySelectorAll('.subtab-content').forEach(subtab => { subtab.classList.remove('active'); }); const activeTab = document.getElementById(tabId); activeTab.classList.add('active'); document.querySelectorAll('.tab').forEach(tab => { tab.classList.remove('active'); }); const activeTabElement = document.querySelector(`.tab[onclick*="${tabId}"]`); if (activeTabElement) { activeTabElement.classList.add('active'); } const firstSubtab = activeTab.querySelector('.subtab-content'); if (firstSubtab) { firstSubtab.classList.add('active'); } } function showSubTab(subTabId) { document.querySelectorAll('.tab-content.active .subtab-content').forEach(subtab => { subtab.classList.remove('active'); }); const subtabToShow = document.getElementById(subTabId); subtabToShow.classList.add('active'); document.querySelectorAll('.subtab').forEach(subtab => { subtab.classList.remove('active'); }); const activeSubtabElement = document.querySelector(`.subtab[onclick*="${subTabId}"]`); if (activeSubtabElement) { activeSubtabElement.classList.add('active'); } } function importDataK1() { const fileInput = document.createElement("input"); fileInput.type = "file"; fileInput.accept = ".txt"; fileInput.onchange = (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const data = e.target.result.split('\n').map(line => line.trim()); const dataTable = document.getElementById('dataTable').getElementsByTagName('tbody')[0]; let rowIndex = 0; data.forEach((line, index) => { let row; if (rowIndex < dataTable.rows.length) { row = dataTable.rows[rowIndex]; } else { row = dataTable.insertRow(); row.insertCell(); row.insertCell(); } row.cells[0].textContent = line; rowIndex++; }); }; reader.readAsText(file); }; fileInput.click(); } function importDataK2() { const fileInput = document.createElement("input"); fileInput.type = "file"; fileInput.accept = ".txt"; fileInput.onchange = (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const data = e.target.result.split('\n').map(line => line.trim()); const dataTable = document.getElementById('dataTable').getElementsByTagName('tbody')[0]; let rowIndex = 0; data.forEach((line, index) => { let row; if (rowIndex < dataTable.rows.length) { row = dataTable.rows[rowIndex]; } else { row = dataTable.insertRow(); row.insertCell(); row.insertCell(); } row.cells[1].textContent = line; rowIndex++; }); }; reader.readAsText(file); }; fileInput.click(); } function importDataT1() { const fileInput = document.createElement("input"); fileInput.type = "file"; fileInput.accept = ".txt"; fileInput.onchange = (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const data = e.target.result.split('\n').map(line => line.trim()); const dataTableTTest = document.getElementById('dataTableTTest').getElementsByTagName('tbody')[0]; let rowIndex = 0; data.forEach((line, index) => { let row; if (rowIndex < dataTableTTest.rows.length) { row = dataTableTTest.rows[rowIndex]; } else { row = dataTableTTest.insertRow(); row.insertCell(); row.insertCell(); } row.cells[0].textContent = line; rowIndex++; }); }; reader.readAsText(file); }; fileInput.click(); } function importDataT2() { const fileInput = document.createElement("input"); fileInput.type = "file"; fileInput.accept = ".txt"; fileInput.onchange = (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const data = e.target.result.split('\n').map(line => line.trim()); const dataTableTTest = document.getElementById('dataTableTTest').getElementsByTagName('tbody')[0]; let rowIndex = 0; data.forEach((line, index) => { let row; if (rowIndex < dataTableTTest.rows.length) { row = dataTableTTest.rows[rowIndex]; } else { row = dataTableTTest.insertRow(); row.insertCell(); row.insertCell(); } row.cells[1].textContent = line; rowIndex++; }); }; reader.readAsText(file); }; fileInput.click(); } function importDataKC1() { const fileInput = document.createElement("input"); fileInput.type = "file"; fileInput.accept = ".txt"; fileInput.onchange = (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const data = e.target.result.split('\n').map(line => line.trim()); const dataTable = document.getElementById('classesTable').getElementsByTagName('tbody')[0]; let rowIndex = 0; data.forEach((line, index) => { let row; if (rowIndex < dataTable.rows.length) { row = dataTable.rows[rowIndex]; } else { row = dataTable.insertRow(); row.insertCell(); row.insertCell(); } row.cells[2].textContent = line; rowIndex++; }); }; reader.readAsText(file); }; fileInput.click(); } function importDataKC2() { const fileInput = document.createElement("input"); fileInput.type = "file"; fileInput.accept = ".txt"; fileInput.onchange = (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const data = e.target.result.split('\n').map(line => line.trim()); const dataTable = document.getElementById('classesTable').getElementsByTagName('tbody')[0]; let rowIndex = 0; data.forEach((line, index) => { let row; if (rowIndex < dataTable.rows.length) { row = dataTable.rows[rowIndex]; } else { row = dataTable.insertRow(); row.insertCell(); row.insertCell(); } row.cells[3].textContent = line; rowIndex++; }); }; reader.readAsText(file); }; fileInput.click(); } function importDataTC1() { const fileInput = document.createElement("input"); fileInput.type = "file"; fileInput.accept = ".txt"; fileInput.onchange = (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const data = e.target.result.split('\n').map(line => line.trim()); const dataTableTTest = document.getElementById('classesTableTTest').getElementsByTagName('tbody')[0]; let rowIndex = 0; data.forEach((line, index) => { let row; if (rowIndex < dataTableTTest.rows.length) { row = dataTableTTest.rows[rowIndex]; } else { row = dataTableTTest.insertRow(); row.insertCell(); row.insertCell(); } row.cells[2].textContent = line; rowIndex++; }); }; reader.readAsText(file); }; fileInput.click(); } function importDataTC2() { const fileInput = document.createElement("input"); fileInput.type = "file"; fileInput.accept = ".txt"; fileInput.onchange = (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const data = e.target.result.split('\n').map(line => line.trim()); const dataTableTTest = document.getElementById('classesTableTTest').getElementsByTagName('tbody')[0]; let rowIndex = 0; data.forEach((line, index) => { let row; if (rowIndex < dataTableTTest.rows.length) { row = dataTableTTest.rows[rowIndex]; } else { row = dataTableTTest.insertRow(); row.insertCell(); row.insertCell(); } row.cells[3].textContent = line; rowIndex++; }); }; reader.readAsText(file); }; fileInput.click(); } function clearTable() { const rows = document.querySelectorAll('#dataTable tbody tr'); rows.forEach(row => { row.cells[0].innerText = ''; row.cells[1].innerText = ''; }); const rowsTTest = document.querySelectorAll('#dataTableTTest tbody tr'); rowsTTest.forEach(row => { row.cells[0].innerText = ''; row.cells[1].innerText = ''; }); } document.querySelector('#dataTable tbody').addEventListener('keydown', function (e) { if (e.key === 'Enter') { e.preventDefault(); const row = this.insertRow(); row.innerHTML = ``; } }); function calculateKol() { const rows = document.querySelectorAll('#dataTable tbody tr'); const freq1 = []; const freq2 = []; let n1 = 0; let n2 = 0; let a = 0; rows.forEach(row => { const cellValueA = parseFloat(row.cells[0].innerText) || 0; const cellValueB = parseFloat(row.cells[1].innerText) || 0; if ((!isNaN(cellValueA) && isNaN(cellValueB)) || (isNaN(cellValueA) && !isNaN(cellValueB))) { alert("Data entry error"); return; } if (!isNaN(cellValueA) && !isNaN(cellValueB)) { freq1[a] = cellValueA; freq2[a] = cellValueB; a++; } }); for (let i = 0; i < a; i++) { n1 += freq1[i]; n2 += freq2[i]; } if (a < 6 || n1 < 8 || n2 < 8) { alert("Insufficient data."); return; } const jval1 = new Array(a); const jval2 = new Array(a); jval1[0] = freq1[0] / n1; jval2[0] = freq2[0] / n2; for (let i = 1; i < a; i++) { jval1[i] = jval1[i - 1] + (freq1[i] / n1); jval2[i] = jval2[i - 1] + (freq2[i] / n2); } const DP = new Array(a); DP[0] = Math.abs(jval1[0] - jval2[0]); for (let i = 1; i < a; i++) { DP[i] = Math.abs(jval1[i] - jval2[i]); } const D = Math.max(...DP); document.getElementById('valueD').innerText = D.toFixed(3); const confidenceLevel = parseInt(document.getElementById('confidence').value); let criticalValue; const C1 = Math.sqrt((n1 + n2) / (n1 * n2)); switch (confidenceLevel) { case 80: criticalValue = (1.28 * C1).toFixed(3); break; case 85: criticalValue = (1.34 * C1).toFixed(3); break; case 90: criticalValue = (1.22 * C1).toFixed(3); break; case 95: criticalValue = (1.36 * C1).toFixed(3); break; case 99: criticalValue = (1.63 * C1).toFixed(3); break; default: alert("Invalid confidence level selected."); return; } document.getElementById("criticalValue").textContent = criticalValue; const meanChangeMessage = document.getElementById("distChangeMessageKI"); if (D < criticalValue) { meanChangeMessage.textContent = "The two distributions are not different"; } else { meanChangeMessage.textContent = "The two distributions are different"; } } function applyClasses() { const start = parseFloat(document.getElementById('startClass').value); const end = parseFloat(document.getElementById('endClass').value); const numClasses = parseInt(document.getElementById('numClasses').value); const classesTable = document.getElementById('classesTable'); const classesBody = document.getElementById('classesBody'); classesBody.innerHTML = ''; if (numClasses > 0) { const interval = Math.abs(end - start) / numClasses; for (let i = 0; i < numClasses; i++) { let from, to; if (start < end) { from = (start + (i * interval)).toFixed(2); to = (start + ((i + 1) * interval)).toFixed(2); } else { from = (start - (i * interval)).toFixed(2); to = (start - ((i + 1) * interval)).toFixed(2); } const row = ` ${from} ${to} `; classesBody.innerHTML += row; } classesTable.style.display = 'table'; } } function clearClasses() { document.getElementById('classesBody').innerHTML = ''; document.getElementById('classesTable').style.display = 'none'; document.getElementById('startClass').value = ''; document.getElementById('endClass').value = ''; document.getElementById('numClasses').value = ''; } function calculateClasses() { const rows = document.querySelectorAll('#classesTable tbody tr'); const freq1 = []; const freq2 = []; let n1 = 0; let n2 = 0; let a = 0; rows.forEach(row => { if (row.cells.length < 4) { return; } const cellValueA = parseFloat(row.cells[2].innerText) || 0; const cellValueB = parseFloat(row.cells[3].innerText) || 0; if ((!isNaN(cellValueA) && isNaN(cellValueB)) || (isNaN(cellValueA) && !isNaN(cellValueB))) { alert("Data entry error"); return; } if (!isNaN(cellValueA) && !isNaN(cellValueB)) { freq1[a] = cellValueA; freq2[a] = cellValueB; a++; } }); for (let i = 0; i < a; i++) { n1 += freq1[i]; n2 += freq2[i]; } if (a < 6 || n1 < 8 || n2 < 8) { alert("Insufficient data."); return; } const jval1 = new Array(a); const jval2 = new Array(a); jval1[0] = freq1[0] / n1; jval2[0] = freq2[0] / n2; for (let i = 1; i < a; i++) { jval1[i] = jval1[i - 1] + (freq1[i] / n1); jval2[i] = jval2[i - 1] + (freq2[i] / n2); } const DP = new Array(a); DP[0] = Math.abs(jval1[0] - jval2[0]); for (let i = 1; i < a; i++) { DP[i] = Math.abs(jval1[i] - jval2[i]); } const D = Math.max(...DP); document.getElementById('valueDClasses').innerText = D.toFixed(3); const confidenceLevel = parseInt(document.getElementById('confidenceClasses').value); let criticalValue; const C1 = Math.sqrt((n1 + n2) / (n1 * n2)); switch (confidenceLevel) { case 80: criticalValue = (1.28 * C1).toFixed(3); break; case 85: criticalValue = (1.34 * C1).toFixed(3); break; case 90: criticalValue = (1.22 * C1).toFixed(3); break; case 95: criticalValue = (1.36 * C1).toFixed(3); break; case 99: criticalValue = (1.63 * C1).toFixed(3); break; default: alert("Invalid confidence level selected."); return; } document.getElementById('criticalValueClasses').innerText = criticalValue; const meanChangeMessage = document.getElementById("distChangeMessageKC"); if (D < criticalValue) { meanChangeMessage.textContent = "The two distributions are not different"; } else { meanChangeMessage.textContent = "The two distributions are different"; } } function calculateT() { const column1 = document.querySelectorAll("#dataTableTTest tr td:nth-child(2)"); const column2 = document.querySelectorAll("#dataTableTTest tr td:nth-child(1)"); let sum1 = 0, sum2 = 0, sumSq1 = 0, sumSq2 = 0; const n1 = column1.length; const n2 = column2.length; if (n1 === 0 || n2 === 0) { alert("Error: One of the data sets is empty."); return; } column1.forEach(cell => { const value = parseFloat(cell.textContent); if (!isNaN(value)) { sum1 += value; sumSq1 += value * value; } else { console.warn("Non-numeric value found in column 1:", cell.textContent); } }); column2.forEach(cell => { const value = parseFloat(cell.textContent); if (!isNaN(value)) { sum2 += value; sumSq2 += value * value; } else { console.warn("Non-numeric value found in column 2:", cell.textContent); } }); const mean1 = sum1 / n1; const mean2 = sum2 / n2; document.getElementById("meanDataSet1").textContent = mean1.toFixed(2); document.getElementById("meanDataSet2").textContent = mean2.toFixed(2); const sigma = Math.sqrt(((sumSq1 - (sum1 * sum1 / n1)) + (sumSq2 - (sum2 * sum2 / n2))) / (n1 + n2 - 2)); if (isNaN(sigma) || sigma === 0) { alert("Error: Standard deviation calculation resulted in an invalid value."); return; } const tValue = (mean1 - mean2) / sigma * Math.sqrt((n1 * n2) / (n1 + n2)); document.getElementById("tValue").textContent = tValue.toFixed(3); const degreesOfFreedom = n1 + n2 - 2; const confidenceSelect = document.getElementById("confidence_ttest"); const confidenceLevel = parseFloat(confidenceSelect.value) / 100; const tCriticalValue = jStat.studentt.inv(1 - (1 - confidenceLevel) / 2, degreesOfFreedom); document.getElementById("tCriticalValue").textContent = tCriticalValue.toFixed(3); const labelT = document.getElementById("dynamicLabelTI"); const alpha = (1 - confidenceLevel).toFixed(2); labelT.innerHTML = `t${degreesOfFreedom}, ${alpha}:`; const meanChangeMessage = document.getElementById("meanChangeMessageTI"); if (tValue < tCriticalValue) { meanChangeMessage.textContent = "The mean has not changed"; } else { meanChangeMessage.textContent = "The mean has changed"; } } function applyClassesTTest() { const start = parseFloat(document.getElementById('startClassTTest').value); const end = parseFloat(document.getElementById('endClassTTest').value); const numClasses = parseInt(document.getElementById('numClassesTTest').value); const classesTableTTest = document.getElementById('classesTableTTest'); const classesBodyTTest = document.getElementById('classesBodyTTest'); classesBodyTTest.innerHTML = ''; if (numClasses > 0) { const interval = Math.abs(end - start) / numClasses; let currentStart = start; let currentEnd = start; if (start < end) { currentEnd += interval; } else { currentEnd -= interval; } while ((start < end && currentEnd <= end) || (start >= end && currentEnd >= end)) { const row = ` ${currentStart.toFixed(2)} ${currentEnd.toFixed(2)} `; classesBodyTTest.innerHTML += row; currentStart = currentEnd; if (start < end) { currentEnd += interval; } else { currentEnd -= interval; } } classesTableTTest.style.display = 'table'; } } function clearClassesTTest() { document.getElementById('classesBodyTTest').innerHTML = ''; document.getElementById('classesTableTTest').style.display = 'none'; document.getElementById('startClassTTest').value = ''; document.getElementById('endClassTTest').value = ''; document.getElementById('numClassesTTest').value = ''; } function calculateClassesTTest() { const column1 = document.querySelectorAll("#classesTableTTest tr td:nth-child(4)"); const column2 = document.querySelectorAll("#classesTableTTest tr td:nth-child(3)"); let sum1 = 0, sum2 = 0, sumSq1 = 0, sumSq2 = 0; let n1 = column1.length, n2 = column2.length; column1.forEach(cell => { const value = parseFloat(cell.textContent); sum1 += value; sumSq1 += value * value; }); column2.forEach(cell => { const value = parseFloat(cell.textContent); sum2 += value; sumSq2 += value * value; }); const mean1 = sum1 / n1; const mean2 = sum2 / n2; document.getElementById("meanDataSetC1").textContent = mean2.toFixed(2); document.getElementById("meanDataSetC2").textContent = mean1.toFixed(2); const sigma = Math.sqrt(((sumSq1 - (sum1 * sum1 / n1)) + (sumSq2 - (sum2 * sum2 / n2))) / (n1 + n2 - 2)); const tValue = (mean1 - mean2) / sigma * Math.sqrt((n1 * n2) / (n1 + n2)); document.getElementById("tValueC").textContent = tValue.toFixed(3); const degreesOfFreedom = n1 + n2 - 2; const confidenceSelect = document.getElementById("confidenceClassesTTest"); const confidenceLevel = parseFloat(confidenceSelect.value) / 100; const tCriticalValue = jStat.studentt.inv(1 - (1 - confidenceLevel) / 2, degreesOfFreedom); document.getElementById("tCriticalValueC").textContent = tCriticalValue.toFixed(3); const labelT = document.getElementById("dynamicLabelTC"); const alpha = (1 - confidenceLevel).toFixed(2); labelT.innerHTML = `t${degreesOfFreedom}, ${alpha}:`; const meanChangeMessage = document.getElementById("meanChangeMessageTC"); if (tValue < tCriticalValue) { meanChangeMessage.textContent = "The mean has not changed"; } else { meanChangeMessage.textContent = "The mean has changed"; } } function calculateSummaryT() { const nbS = parseFloat(document.getElementById("nbS").value); const sumBiS = parseFloat(document.getElementById("sumBiS").value); const sumBiSquaredS = parseFloat(document.getElementById("sumBiSquaredS").value); const naS = parseFloat(document.getElementById("naS").value); const sumAiS = parseFloat(document.getElementById("sumAiS").value); const sumAiSquaredS = parseFloat(document.getElementById("sumAiSquaredS").value); const meanDataSetS1 = sumBiS / nbS; const meanDataSetS2 = sumAiS / naS; document.getElementById("meanDataSetS1").textContent = meanDataSetS1.toFixed(2); document.getElementById("meanDataSetS2").textContent = meanDataSetS2.toFixed(2); const sigmaS = Math.sqrt(((sumAiSquaredS - (sumAiS ** 2) / naS) + (sumBiSquaredS - (sumBiS ** 2) / nbS)) / (naS + nbS - 2)); const tS = ((meanDataSetS2 - meanDataSetS1) / sigmaS) * Math.sqrt((naS * nbS) / (naS + nbS)); document.getElementById("tValueS").textContent = tS.toFixed(3); const degreesOfFreedomS = naS + nbS - 2; const confidenceSelectS = document.getElementById("confidenceSummary"); const confidenceLevelS = parseFloat(confidenceSelectS.value) / 100; const tCriticalValueS = jStat.studentt.inv(1 - (1 - confidenceLevelS) / 2, degreesOfFreedomS); document.getElementById("tCriticalS").textContent = tCriticalValueS.toFixed(3); const labelT = document.getElementById("dynamicLabelT"); const alpha = (1 - confidenceLevelS).toFixed(2); labelT.innerHTML = `t${degreesOfFreedomS}, ${alpha}:`; const meanChangeMessage = document.getElementById("meanChangeMessageS"); if (tS < 0) { meanChangeMessage.textContent = "The mean has decreased"; } else { meanChangeMessage.textContent = "The mean has increased"; } }