This document can be found on RPubs http://rpubs.com/ShKlinkenberg/225952

Set parameters

min.score         = 0
min.grade         = 1
min.grade         = min.grade/10
max.score         = 100
cutoff.precentage = .5
guess.score       = 20
non.guess.score   = max.score - guess.score
guess.percentage  = guess.score / max.score
score = min.score:max.score
score
  [1]   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40
 [42]  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81
 [83]  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100

Create Score Grade transformation function

ScoreGradeTransformation <- function(score, guess.score, min.grade, cutoff.precentage, max.score) {
    # Computes the grade corrected for guessing.
    #
    # Args:
    #   score             : Value or vector with raw exam scores
    #   guess.score       : Total amount of raw guessing score
    #   min.grade         : Minimal grate to be given
    #   cutoff.precentage : Raw cut-off score for a pass mark
    #   max.score         : Maximum raw score to be given
    #
    # Returns:
    #   Grade expressed as a number between minimal grade and 10
    
    # Setup vector to store grades
    grade = vector()
    
    # Determine cut-off score based on percentage and guessing score
    cutoff.score = guess.score + ( cutoff.precentage * (non.guess.score) )
    
    # Grade when guessing
      grade[score <= guess.score] = min.grade
    # Grade between guessing and cutoff
    
    ## Slope of transformation function
    a.tot.cutoff = (cutoff.precentage - min.grade) / (cutoff.score - guess.score); a.tot.cutoff
    
    grade[score > guess.score & score < cutoff.score] = (a.tot.cutoff * (score[score > guess.score & score < cutoff.score]-guess.score)) + min.grade
    
    # Grade between cutoff and max score
    
    ## Slope of transformation function
    a.na.cutoff = (1 - cutoff.precentage) / (max.score - cutoff.score); a.na.cutoff   
             
    grade[score >= cutoff.score] = (a.na.cutoff * (score[score >= cutoff.score]-cutoff.score)) + cutoff.precentage
    
    return(grade * 10)   
}   

Apply Score Grade Transformation function

grade <- ScoreGradeTransformation(score, guess.score, min.grade, cutoff.precentage, max.score) 

Plot score grade transformation

LS0tCnRpdGxlOiAiU2NvcmUgR3JhZGUgVHJhbnNmb3JtYXRpb24iCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdAotLS0KClRoaXMgZG9jdW1lbnQgY2FuIGJlIGZvdW5kIG9uIFJQdWJzIGh0dHA6Ly9ycHVicy5jb20vU2hLbGlua2VuYmVyZy8yMjU5NTIKCmBgYHtyLCBlY2hvPUZBTFNFfQpybShsaXN0ID0gbHMoKSkKYGBgCgojIyBTZXQgcGFyYW1ldGVycwoKYGBge3J9Cm1pbi5zY29yZSAgICAgICAgID0gMAptaW4uZ3JhZGUgICAgICAgICA9IDEKbWluLmdyYWRlICAgICAgICAgPSBtaW4uZ3JhZGUvMTAKbWF4LnNjb3JlICAgICAgICAgPSAxMDAKY3V0b2ZmLnByZWNlbnRhZ2UgPSAuNQpndWVzcy5zY29yZSAgICAgICA9IDIwCm5vbi5ndWVzcy5zY29yZSAgID0gbWF4LnNjb3JlIC0gZ3Vlc3Muc2NvcmUKZ3Vlc3MucGVyY2VudGFnZSAgPSBndWVzcy5zY29yZSAvIG1heC5zY29yZQoKc2NvcmUgPSBtaW4uc2NvcmU6bWF4LnNjb3JlCnNjb3JlCmBgYAoKIyMgQ3JlYXRlIFNjb3JlIEdyYWRlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uCgpgYGB7cn0KU2NvcmVHcmFkZVRyYW5zZm9ybWF0aW9uIDwtIGZ1bmN0aW9uKHNjb3JlLCBndWVzcy5zY29yZSwgbWluLmdyYWRlLCBjdXRvZmYucHJlY2VudGFnZSwgbWF4LnNjb3JlKSB7CiAgICAjIENvbXB1dGVzIHRoZSBncmFkZSBjb3JyZWN0ZWQgZm9yIGd1ZXNzaW5nLgogICAgIwogICAgIyBBcmdzOgogICAgIyAgIHNjb3JlICAgICAgICAgICAgIDogVmFsdWUgb3IgdmVjdG9yIHdpdGggcmF3IGV4YW0gc2NvcmVzCiAgICAjICAgZ3Vlc3Muc2NvcmUgICAgICAgOiBUb3RhbCBhbW91bnQgb2YgcmF3IGd1ZXNzaW5nIHNjb3JlCiAgICAjICAgbWluLmdyYWRlICAgICAgICAgOiBNaW5pbWFsIGdyYXRlIHRvIGJlIGdpdmVuCiAgICAjICAgY3V0b2ZmLnByZWNlbnRhZ2UgOiBSYXcgY3V0LW9mZiBzY29yZSBmb3IgYSBwYXNzIG1hcmsKICAgICMgICBtYXguc2NvcmUgICAgICAgICA6IE1heGltdW0gcmF3IHNjb3JlIHRvIGJlIGdpdmVuCiAgICAjCiAgICAjIFJldHVybnM6CiAgICAjICAgR3JhZGUgZXhwcmVzc2VkIGFzIGEgbnVtYmVyIGJldHdlZW4gbWluaW1hbCBncmFkZSBhbmQgMTAKICAgIAogICAgIyBTZXR1cCB2ZWN0b3IgdG8gc3RvcmUgZ3JhZGVzCiAgICBncmFkZSA9IHZlY3RvcigpCiAgICAKICAgICMgRGV0ZXJtaW5lIGN1dC1vZmYgc2NvcmUgYmFzZWQgb24gcGVyY2VudGFnZSBhbmQgZ3Vlc3Npbmcgc2NvcmUKICAgIGN1dG9mZi5zY29yZSA9IGd1ZXNzLnNjb3JlICsgKCBjdXRvZmYucHJlY2VudGFnZSAqIChub24uZ3Vlc3Muc2NvcmUpICkKICAgIAogICAgIyBHcmFkZSB3aGVuIGd1ZXNzaW5nCgkgIGdyYWRlW3Njb3JlIDw9IGd1ZXNzLnNjb3JlXSA9IG1pbi5ncmFkZQoKICAgICMgR3JhZGUgYmV0d2VlbiBndWVzc2luZyBhbmQgY3V0b2ZmCiAgICAKICAgICMjIFNsb3BlIG9mIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uCiAgICBhLnRvdC5jdXRvZmYgPSAoY3V0b2ZmLnByZWNlbnRhZ2UgLSBtaW4uZ3JhZGUpIC8gKGN1dG9mZi5zY29yZSAtIGd1ZXNzLnNjb3JlKTsgYS50b3QuY3V0b2ZmCiAgICAKICAgIGdyYWRlW3Njb3JlID4gZ3Vlc3Muc2NvcmUgJiBzY29yZSA8IGN1dG9mZi5zY29yZV0gPSAoYS50b3QuY3V0b2ZmICogKHNjb3JlW3Njb3JlID4gZ3Vlc3Muc2NvcmUgJiBzY29yZSA8IGN1dG9mZi5zY29yZV0tZ3Vlc3Muc2NvcmUpKSArIG1pbi5ncmFkZQogICAgCiAgICAjIEdyYWRlIGJldHdlZW4gY3V0b2ZmIGFuZCBtYXggc2NvcmUKICAgIAogICAgIyMgU2xvcGUgb2YgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24KICAgIGEubmEuY3V0b2ZmID0gKDEgLSBjdXRvZmYucHJlY2VudGFnZSkgLyAobWF4LnNjb3JlIC0gY3V0b2ZmLnNjb3JlKTsgYS5uYS5jdXRvZmYgICAKICAgIAkgICAgIAogICAgZ3JhZGVbc2NvcmUgPj0gY3V0b2ZmLnNjb3JlXSA9IChhLm5hLmN1dG9mZiAqIChzY29yZVtzY29yZSA+PSBjdXRvZmYuc2NvcmVdLWN1dG9mZi5zY29yZSkpICsgY3V0b2ZmLnByZWNlbnRhZ2UKICAgIAogICAgcmV0dXJuKGdyYWRlICogMTApICAgCn0gICAKYGBgCgojIyMgQXBwbHkgU2NvcmUgR3JhZGUgVHJhbnNmb3JtYXRpb24gZnVuY3Rpb24KCmBgYHtyfQpncmFkZSA8LSBTY29yZUdyYWRlVHJhbnNmb3JtYXRpb24oc2NvcmUsIGd1ZXNzLnNjb3JlLCBtaW4uZ3JhZGUsIGN1dG9mZi5wcmVjZW50YWdlLCBtYXguc2NvcmUpIApgYGAKCiMjIFBsb3Qgc2NvcmUgZ3JhZGUgdHJhbnNmb3JtYXRpb24KCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIGluc3RhbGwucGFja2FnZXMoJ21hZ3JpdHRyJykKIyBpbnN0YWxsLnBhY2thZ2VzKCdoaWdoY2hhcnRlcicpCmxpYnJhcnkoJ2dncGxvdDInKQpsaWJyYXJ5KCdtYWdyaXR0cicpCmxpYnJhcnkoJ2hpZ2hjaGFydGVyJykKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0Kc2xvcGVzIDwtIGRhdGEuZnJhbWUoc2NvcmUsIGdyYWRlKQoKaGMgPC0gaGlnaGNoYXJ0KCkgJT4lIAogIGhjX3hBeGlzKGNhdGVnb3JpZXMgPSBzbG9wZXMkc2NvcmUpICU+JSAKICBoY19hZGRfc2VyaWVzKG5hbWUgPSAiSW5pdGlhbCIsICBkYXRhID0gc2xvcGVzJGdyYWRlKSAlPiUKICAgICAgIGhjX3hBeGlzKG1pbiA9IDAsIG1heCA9IG1heC5zY29yZSwgdGl0bGUgPSBsaXN0KHRleHQgPSAiU2NvcmUiKSkgJT4lCiAgICAgICBoY195QXhpcyhtaW4gPSAwLCBtYXggPSAxMCwgdGl0bGUgPSBsaXN0KHRleHQgPSAiR3JhZGUiKSkKaGMKYGBg