MediaWiki:Lékařská kalkulačka/PD-MCI.js

Z WikiSkript

Poznámka: Po zveřejnění musíte vyprázdnit cache vašeho prohlížeče, jinak změny neuvidíte.

  • Firefox / Safari: Při kliknutí na Aktualizovat držte Shift nebo stiskněte Ctrl-F5 nebo Ctrl-R (na Macu ⌘-R)
  • Google Chrome: Stiskněte Ctrl-Shift-R (na Macu ⌘-Shift-R)
  • Internet Explorer / Edge: Při kliknutí na Aktualizovat držte Ctrl nebo stiskněte Ctrl-F5
  • Opera: Stiskněte Ctrl-F5.
/**
 * ReplaceAll by Fagner Brack (MIT Licensed)
 * Replaces all occurrences of a substring in a string
 */
String.prototype.replaceAll = function(token, newToken, ignoreCase) {
    var str, i = -1, _token;
    if((str = this.toString()) && typeof token === "string") {
        _token = ignoreCase === true? token.toLowerCase() : undefined;
        while((i = (
            _token !== undefined? 
                str.toLowerCase().indexOf(
                            _token, 
                            i >= 0? i + newToken.length : 0
                ) : str.indexOf(
                            token,
                            i >= 0? i + newToken.length : 0
                )
        )) !== -1 ) {
            str = str.substring(0, i)
                    .concat(newToken)
                    .concat(str.substring(i + token.length));
        }
    }
return str;
};
 
/**************** Převod do html podoby ****************/
var content = $( '#lekarska_kalkulacka_PDMCI-content' ).text();
$( '#lekarska_kalkulacka_PD-MCI' ).html( content.replaceAll('paragraph', 'p' ).replaceAll( 'resValue', 'span' ).replaceAll('breakline', 'br' ).replaceAll('division', 'div').replaceAll('orderedlist', 'ol').replaceAll('header3', 'h3') );

/**************** Pomocné funkce ****************/

function z2percentile(z) {
  //z == number of standard deviations from the mean
  //if z is greater than 6.5 standard deviations from the mean
  //the number of significant digits will be outside of a reasonable 
  //range
  if ( z < -6.5)
    return 0.0;
  if( z > 6.5) 
    return 1.0;
  var factK = 1;
  var sum = 0;
  var term = 1;
  var k = 0;
  var loopStop = Math.exp(-23);
  while(Math.abs(term) > loopStop) 
  {
    term = .3989422804 * Math.pow(-1,k) * Math.pow(z,k) / (2 * k + 1) / Math.pow(2,k) * Math.pow(z,k+1) / factK;
    sum += term;
    k++;
    factK *= k;
  }
  sum += 0.5;
  return 100 * sum;
}

function lekarska_kalkulacka_PDMCI_round( num ) {
  return Math.round( num * 100 )/100;
}

//list of all exams:
var lekarska_kalkulacka_PDMCI_exams = ['tmta', 'dsb', 'tol', 'sf', 'waisrsim', 'bnt', 'ravltdr', 'bvmtdr', 'jol', 'cloxi' ];

function lekarska_kalkulacka_PDMCI_calculate() {
  //constants for mean, age, gender, education and root-mean-squared-error.
  var params = {
    'tmta': {'mean': 26.9158786733743, 'age': 0.79620528727942, 'gender': 4.74634500135709, 'education': -2.39555789653284, 'rmse': 21.5263435503107, 'sign': -1},
    'dsb': {'mean': 6.22505145210761, 'age': -0.0353867065943914, 'gender': 0.0504968458243749, 'education': 0.145660577638105, 'rmse': 1.73431460274184, 'sign': 1},
    'tol': {'mean': 26.212, 'age': -0.02, 'gender': 0.876, 'education': 0.123, 'rmse': 4.0180142746561, 'sign': 1},
    'sf': {'mean': 23.264086457321, 'age': -0.120157685039321, 'gender': -1.44318686698752, 'education': 0.50860013280954, 'rmse': 5.25757400801454, 'sign': 1},
    'waisrsim': {'mean': 16.1402735987095, 'age': 0.0110148506822712, 'gender': 0.406095078769549, 'education': 0.405391790083139, 'rmse': 2.90446499325018, 'sign': 1},
    'bnt': {'mean': 28.914, 'age': -0.03, 'gender': 0.528, 'education': 0.118, 'rmse': 2.0352323641588, 'sign': 1},
    'ravltdr': {'mean': 10.0782355220185, 'age': -0.0596358856716573, 'gender': -1.18442668955274, 'education': 0.177938240926311, 'rmse': 3.13935122843155, 'sign': 1},
    'bvmtdr': {'mean': -7.894, 'age': 0.224, 'gender': -0.49, 'education': -0.081, 'rmse': 1.37805118389885, 'sign': 1},
    'jol': {'mean': 21.265817188006, 'age': -0.00668162115988829, 'gender': 1.59561981002336, 'education': 0.298311430076549, 'rmse': 2.70879202666548, 'sign': 1},
    'cloxi': {'mean': 14.0595765238921, 'age': -0.00607962563105891, 'gender': -0.125831401116365, 'education': 0.0256924652224113, 'rmse': 1.09114056301701, 'sign': 1}
  }
  var results = { 'very_superior': [], 'superior': [], 'high_average': [], 'average': [], 'low_average': [], 'midly_impaired': [], 'moderately_impaired': [], 'severely_impaired': []};
  var fullnames = { 'tmta': 'TMT-A', 'dsb': 'DS backwards', 'tol': 'ToL', 'sf': 'Semantic fluency', 'waisrsim': 'WAIS-R Similarities', 'bnt': 'BNT-30', 'ravltdr': 'RAVLT-DR', 'bvmtdr': 'BVMT-DR', 'jol': 'JoL', 'cloxi': 'CLOX I' };

  for (var i = 0; i < lekarska_kalkulacka_PDMCI_exams.length; i++) {
    var exam = lekarska_kalkulacka_PDMCI_exams[i];
    var value = $( '#lekarska_kalkulacka_PDMCI-' + exam + '-number' ).val();
    var gender = $('input[name=gender]:checked', '#lekarska_kalkulacka_PDMCI-gender').val();
    var age = $('#lekarska_kalkulacka_PDMCI-age-number').val();
    var education = $('#lekarska_kalkulacka_PDMCI-education-number').val();
    var mean = params[exam]['mean'];
    var age_factor = params[exam]['age'];
    var gender_factor = params[exam]['gender'];
    var education_factor = params[exam]['education'];
    var sign = params[exam]['sign'];
    var rmse = params[exam]['rmse'];
    var zscore = sign * ((value - (mean + age * age_factor + gender * gender_factor + education * education_factor))/rmse);
    var perc = z2percentile( zscore );
    $( '#lekarska_kalkulacka_PDMCI-' + exam + '-Z' ).val( lekarska_kalkulacka_PDMCI_round(zscore) );
    $( '#lekarska_kalkulacka_PDMCI-' + exam + '-perc' ).val( lekarska_kalkulacka_PDMCI_round(perc) );

    if ( zscore < -2.5 ) $( '#lekarska_kalkulacka_PDMCI-' + exam + '-SD' ).html( '-2.5 SD' );
    else if ( zscore < -2 ) $( '#lekarska_kalkulacka_PDMCI-' + exam + '-SD' ).html( '-2 SD' );
    else if ( zscore < -1.5 ) $( '#lekarska_kalkulacka_PDMCI-' + exam + '-SD' ).html( '-1.5 SD' );
    else if ( zscore < -1 ) $( '#lekarska_kalkulacka_PDMCI-' + exam + '-SD' ).html( '-1 SD' );
    else $( '#lekarska_kalkulacka_PDMCI-' + exam + '-SD' ).html( '' );

    if (perc >= 98 ) {
       results['very_superior'].push( fullnames[ exam ] );
    } else if ( perc >= 91 ) {
       results['superior'].push( fullnames[ exam ] );
    } else if ( perc >= 75 ) {
       results['high_average'].push( fullnames[ exam ] );
    } else if ( perc >= 25 ) {
       results['average'].push( fullnames[ exam ] );
    } else if ( perc >= 9 ) {
       results['low_average'].push( fullnames[ exam ] );
    } else if ( perc >= 2 ) {
       results['midly_impaired'].push( fullnames[ exam ] );
    } else if ( perc >= 1 ) {
       results['moderately_impaired'].push( fullnames[ exam ] );
    } else {
       results['severely_impaired'].push( fullnames[ exam ] );
    }
  }
  var resulthtml = '';
  if (results['very_superior'].length > 0) resulthtml += '<p><b>Very superior:</b> ' + results['very_superior'].join() + '</p>';
  if (results['superior'].length > 0) resulthtml += '<p><b>Superior:</b> ' + results['superior'].join() + '</p>';
  if (results['high_average'].length > 0) resulthtml += '<p><b>High average:</b> ' + results['high_average'].join() + '</p>';
  if (results['average'].length > 0) resulthtml += '<p><b>Average:</b> ' + results['average'].join() + '</p>';
  if (results['low_average'].length > 0) resulthtml += '<p><b>Low average:</b> ' + results['low_average'].join() + '</p>';
  if (results['midly_impaired'].length > 0) resulthtml += '<p><b>Midly impaired:</b> ' + results['midly_impaired'].join() + '</p>';
  if (results['moderately_impaired'].length > 0) resulthtml += '<p><b>Moderately impaired:</b> ' + results['moderately_impaired'].join() + '</p>';
  if (results['severely_impaired'].length > 0) resulthtml += '<p><b>Severely impaired:</b> ' + results['severely_impaired'].join() + '</p>';
  $( '#lekarska_kalkulacka_PDMCI-vysledek').html(resulthtml);
}

function lekarska_kalkulacka_PDMCI_set( name, value ) {
 $('#lekarska_kalkulacka_PDMCI-' + name + '-range').val(value);
 $('#lekarska_kalkulacka_PDMCI-' + name + '-number').val(value);
}

/**************** Vlastní výpočet ****************/
//list of all ids ('-range' and '-number' for each)
var lekarska_kalkulacka_PDMCI_ids = [
  'lekarska_kalkulacka_PDMCI-tmta-range',
  'lekarska_kalkulacka_PDMCI-tmta-number',
  'lekarska_kalkulacka_PDMCI-dsb-range',
  'lekarska_kalkulacka_PDMCI-dsb-number',
  'lekarska_kalkulacka_PDMCI-tol-range',
  'lekarska_kalkulacka_PDMCI-tol-number',
  'lekarska_kalkulacka_PDMCI-sf-range',
  'lekarska_kalkulacka_PDMCI-sf-number',
  'lekarska_kalkulacka_PDMCI-waisrsim-range',
  'lekarska_kalkulacka_PDMCI-waisrsim-number',
  'lekarska_kalkulacka_PDMCI-bnt-range',
  'lekarska_kalkulacka_PDMCI-bnt-number',
  'lekarska_kalkulacka_PDMCI-ravltdr-range',
  'lekarska_kalkulacka_PDMCI-ravltdr-number',
  'lekarska_kalkulacka_PDMCI-bvmtdr-range',
  'lekarska_kalkulacka_PDMCI-bvmtdr-number',
  'lekarska_kalkulacka_PDMCI-jol-range',
  'lekarska_kalkulacka_PDMCI-jol-number',
  'lekarska_kalkulacka_PDMCI-cloxi-range',
  'lekarska_kalkulacka_PDMCI-cloxi-number',
  'lekarska_kalkulacka_PDMCI-age-range',
  'lekarska_kalkulacka_PDMCI-age-number',
  'lekarska_kalkulacka_PDMCI-education-range',
  'lekarska_kalkulacka_PDMCI-education-number'
];
var lekarska_kalkulacka_PDMCI_id2name = {
  'lekarska_kalkulacka_PDMCI-tmta-range': 'tmta',
  'lekarska_kalkulacka_PDMCI-tmta-number': 'tmta',
  'lekarska_kalkulacka_PDMCI-dsb-range': 'dsb',
  'lekarska_kalkulacka_PDMCI-dsb-number': 'dsb',
  'lekarska_kalkulacka_PDMCI-tol-range': 'tol',
  'lekarska_kalkulacka_PDMCI-tol-number': 'tol',
  'lekarska_kalkulacka_PDMCI-sf-range': 'sf',
  'lekarska_kalkulacka_PDMCI-sf-number': 'sf',
  'lekarska_kalkulacka_PDMCI-waisrsim-range': 'waisrsim',
  'lekarska_kalkulacka_PDMCI-waisrsim-number': 'waisrsim',
  'lekarska_kalkulacka_PDMCI-bnt-range': 'bnt',
  'lekarska_kalkulacka_PDMCI-bnt-number': 'bnt',
  'lekarska_kalkulacka_PDMCI-ravltdr-range': 'ravltdr',
  'lekarska_kalkulacka_PDMCI-ravltdr-number': 'ravltdr',
  'lekarska_kalkulacka_PDMCI-bvmtdr-range': 'bvmtdr',
  'lekarska_kalkulacka_PDMCI-bvmtdr-number': 'bvmtdr',
  'lekarska_kalkulacka_PDMCI-jol-range': 'jol',
  'lekarska_kalkulacka_PDMCI-jol-number': 'jol',
  'lekarska_kalkulacka_PDMCI-cloxi-range': 'cloxi',
  'lekarska_kalkulacka_PDMCI-cloxi-number': 'cloxi',
  'lekarska_kalkulacka_PDMCI-age-range': 'age',
  'lekarska_kalkulacka_PDMCI-age-number': 'age',
  'lekarska_kalkulacka_PDMCI-education-range': 'education',
  'lekarska_kalkulacka_PDMCI-education-number': 'education'
};

$( 'input' ).change( function() {
  //if an input that corresponds to an exam is changed, then run the calculation
  if ( $.inArray( $(this).attr('id'), lekarska_kalkulacka_PDMCI_ids ) ) {
    //1st argument is name of the input (mapped from id), 2nd argument is its value.
    lekarska_kalkulacka_PDMCI_set( lekarska_kalkulacka_PDMCI_id2name[$(this).attr('id')], $(this).val() );
  }
  $('#lekarska_kalkulacka_PDMCI-tmta-number').val($('#lekarska_kalkulacka_PDMCI-tmta-range').val());
  lekarska_kalkulacka_PDMCI_calculate();
});

/*
$( 'input' ).change( function() {
  var result = 'result';
 $( '#lekarska_kalkulacka_PDMCI-vysledek' ).html( result );
});
*/