Questa è una vecchia versione del documento!


<!DOCTYPE html> <html lang=“it”> <head>

  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Calcolatore Probabilità NEC</title>
  <style>
      .nec-calculator {
          max-width: 800px;
          margin: 20px auto;
          font-family: Arial, sans-serif;
          background: #f9f9f9;
          padding: 20px;
          border-radius: 8px;
          box-shadow: 0 2px 10px rgba(0,0,0,0.1);
      }
      
      .input-section {
          background: white;
          padding: 15px;
          margin-bottom: 20px;
          border-radius: 5px;
          border-left: 4px solid #2196F3;
      }
      
      .probability-display {
          background: #e3f2fd;
          padding: 15px;
          margin-bottom: 20px;
          border-radius: 5px;
          text-align: center;
          font-size: 18px;
          font-weight: bold;
      }
      
      .signs-grid {
          display: grid;
          grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
          gap: 10px;
          margin-bottom: 20px;
      }
      
      .sign-card {
          background: white;
          padding: 12px;
          border-radius: 5px;
          border: 1px solid #ddd;
          cursor: pointer;
          transition: all 0.3s ease;
      }
      
      .sign-card:hover {
          background: #f0f8ff;
          border-color: #2196F3;
      }
      
      .sign-card.positive {
          background: #ffebee;
          border-color: #f44336;
      }
      
      .sign-card.negative {
          background: #e8f5e8;
          border-color: #4caf50;
      }
      
      .sign-name {
          font-weight: bold;
          margin-bottom: 5px;
      }
      
      .sign-lr {
          font-size: 12px;
          color: #666;
      }
      
      .calculation-history {
          background: white;
          padding: 15px;
          border-radius: 5px;
          margin-bottom: 20px;
      }
      
      .calculation-step {
          padding: 8px;
          margin-bottom: 8px;
          background: #f5f5f5;
          border-radius: 3px;
          font-family: monospace;
          font-size: 14px;
      }
      
      .controls {
          text-align: center;
      }
      
      .btn {
          background: #2196F3;
          color: white;
          border: none;
          padding: 10px 20px;
          border-radius: 5px;
          cursor: pointer;
          margin: 5px;
          font-size: 14px;
      }
      
      .btn:hover {
          background: #1976D2;
      }
      
      .btn-reset {
          background: #f44336;
      }
      
      .btn-reset:hover {
          background: #d32f2f;
      }
      
      input[type="number"] {
          width: 80px;
          padding: 5px;
          border: 1px solid #ddd;
          border-radius: 3px;
      }
      
      .legend {
          font-size: 12px;
          color: #666;
          margin-top: 10px;
      }
  </style>

</head> <body>

  <div class="nec-calculator">
      <h2>🩺 Calcolatore Probabilità NEC</h2>
      
      <div class="input-section">
          <label for="priorProb">Probabilità a priori (0-1): </label>
          <input type="number" id="priorProb" min="0" max="1" step="0.01" value="0.2">
          <button class="btn" onclick="updatePriorProbability()">Aggiorna</button>
      </div>
      
      <div class="probability-display" id="currentProb">
          Probabilità attuale: 20.0%
      </div>
      
      <h3>Segni Clinici</h3>
      <div class="signs-grid" id="clinicalSigns"></div>
      
      <h3>Segni Radiologici</h3>
      <div class="signs-grid" id="radiologicalSigns"></div>
      
      <div class="legend">
          💡 Clicca sui segni per aggiungerli come positivi (rosso) o negativi (verde). Clicca nuovamente per rimuoverli.
      </div>
      
      <div class="calculation-history">
          <h3>Cronologia Calcoli</h3>
          <div id="calculationSteps"></div>
      </div>
      
      <div class="controls">
          <button class="btn btn-reset" onclick="resetCalculation()">Reset Calcolo</button>
          <button class="btn" onclick="exportResults()">Esporta Risultati</button>
      </div>
  </div>
  <script>
      // Dati LR per i segni/sintomi di NEC
      const necSigns = {
          clinical: [
              {name: "Distensione addominale", lrPos: 1.71, lrNeg: 0.33},
              {name: "Dolorabilità addominale", lrPos: 7.05, lrNeg: 0.62},
              {name: "Aspirato aumentato/bilioso", lrPos: 1.17, lrNeg: 0.91},
              {name: "Colorazione addominale", lrPos: 8.54, lrNeg: 0.81},
              {name: "Massa addominale", lrPos: 1.27, lrNeg: 1.00},
              {name: "Sangue nelle feci", lrPos: 8.79, lrNeg: 0.81},
              {name: "Muco nelle feci", lrPos: 7.14, lrNeg: 0.96}
          ],
          radiological: [
              {name: "Pneumatosi", lrPos: 43.6, lrNeg: 0.57},
              {name: "Gas portale", lrPos: 25.0, lrNeg: 0.98},
              {name: "Pneumoperitoneo", lrPos: 4.16, lrNeg: 0.94},
              {name: "Ansa fissa", lrPos: 2.59, lrNeg: 0.96},
              {name: "Addome senza gas", lrPos: 1.41, lrNeg: 0.99}
          ]
      };
      
      let currentProbability = 0.2;
      let calculationSteps = [];
      let signStates = {}; // 'positive', 'negative', or null
      
      function initializeCalculator() {
          renderSigns('clinical', 'clinicalSigns');
          renderSigns('radiological', 'radiologicalSigns');
          updateDisplay();
      }
      
      function renderSigns(category, containerId) {
          const container = document.getElementById(containerId);
          container.innerHTML = '';
          
          necSigns[category].forEach((sign, index) => {
              const signId = `${category}_${index}`;
              const signElement = document.createElement('div');
              signElement.className = 'sign-card';
              signElement.id = signId;
              signElement.onclick = () => toggleSign(signId, sign);
              
              const state = signStates[signId];
              if (state === 'positive') signElement.classList.add('positive');
              if (state === 'negative') signElement.classList.add('negative');
              
              signElement.innerHTML = `
                  <div class="sign-name">${sign.name}</div>
                  <div class="sign-lr">LR+ = ${sign.lrPos} | LR- = ${sign.lrNeg}</div>
              `;
              
              container.appendChild(signElement);
          });
      }
      
      function toggleSign(signId, signData) {
          const currentState = signStates[signId];
          let newState;
          
          if (currentState === null || currentState === undefined) {
              newState = 'positive';
          } else if (currentState === 'positive') {
              newState = 'negative';
          } else {
              newState = null;
          }
          
          signStates[signId] = newState;
          
          if (newState === 'positive') {
              applyLikelihoodRatio(signData.name, signData.lrPos, true);
          } else if (newState === 'negative') {
              applyLikelihoodRatio(signData.name, signData.lrNeg, false);
          }
          
          // Re-render per aggiornare i colori
          renderSigns('clinical', 'clinicalSigns');
          renderSigns('radiological', 'radiologicalSigns');
          updateDisplay();
      }
      
      function applyLikelihoodRatio(signName, lr, isPositive) {
          const oldProb = currentProbability;
          const oldOdds = oldProb / (1 - oldProb);
          const newOdds = oldOdds * lr;
          const newProb = newOdds / (1 + newOdds);
          
          currentProbability = newProb;
          
          const step = {
              sign: signName,
              type: isPositive ? 'positivo' : 'negativo',
              lr: lr,
              oldProb: oldProb,
              newProb: newProb,
              calculation: `${(oldProb * 100).toFixed(1)}% → Odds: ${oldOdds.toFixed(3)} × ${lr} = ${newOdds.toFixed(3)} → ${(newProb * 100).toFixed(1)}%`
          };
          
          calculationSteps.push(step);
      }
      
      function updatePriorProbability() {
          const newPrior = parseFloat(document.getElementById('priorProb').value);
          if (newPrior >= 0 && newPrior <= 1) {
              currentProbability = newPrior;
              resetCalculation();
          } else {
              alert('Inserire un valore tra 0 e 1');
          }
      }
      
      function updateDisplay() {
          const probDisplay = document.getElementById('currentProb');
          const percentage = (currentProbability * 100).toFixed(1);
          probDisplay.textContent = `Probabilità attuale: ${percentage}%`;
          
          // Cambia colore in base alla probabilità
          if (currentProbability < 0.3) {
              probDisplay.style.backgroundColor = '#e8f5e8';
              probDisplay.style.color = '#2e7d32';
          } else if (currentProbability < 0.7) {
              probDisplay.style.backgroundColor = '#fff3e0';
              probDisplay.style.color = '#f57c00';
          } else {
              probDisplay.style.backgroundColor = '#ffebee';
              probDisplay.style.color = '#c62828';
          }
          
          updateCalculationHistory();
      }
      
      function updateCalculationHistory() {
          const historyContainer = document.getElementById('calculationSteps');
          historyContainer.innerHTML = '';
          
          calculationSteps.forEach((step, index) => {
              const stepElement = document.createElement('div');
              stepElement.className = 'calculation-step';
              stepElement.innerHTML = `
                  ${index + 1}. ${step.sign} (${step.type}) - LR: ${step.lr}<br>
                  ${step.calculation}
              `;
              historyContainer.appendChild(stepElement);
          });
      }
      
      function resetCalculation() {
          currentProbability = parseFloat(document.getElementById('priorProb').value) || 0.2;
          calculationSteps = [];
          signStates = {};
          renderSigns('clinical', 'clinicalSigns');
          renderSigns('radiological', 'radiologicalSigns');
          updateDisplay();
      }
      
      function exportResults() {
          const results = {
              probabilitaFinale: (currentProbability * 100).toFixed(1) + '%',
              probabilitaAPriori: (parseFloat(document.getElementById('priorProb').value) * 100).toFixed(1) + '%',
              segniPresenti: calculationSteps,
              timestamp: new Date().toLocaleString('it-IT')
          };
          
          const exportText = `

Calcolo Probabilità NEC

Data: ${results.timestamp} Probabilità a priori: ${results.probabilitaAPriori} Probabilità finale: ${results.probabilitaFinale}

Segni considerati: ${calculationSteps.map((step, i) ⇒ `${i+1}. ${step.sign} (${step.type}) - LR: ${step.lr} → ${(step.newProb * 100).toFixed(1)}%`).join('\n')}

          `;
          
          navigator.clipboard.writeText(exportText).then(() => {
              alert('Risultati copiati negli appunti!');
          });
      }
      
      // Inizializza il calcolatore
      initializeCalculator();
  </script>

</body> </html>

docuneo/calcolo_probabilita_diagnosi_in_base_a_sequenza_segni_sintomi.1752437035.txt.gz · Ultima modifica: da admin