viernes, 8 de noviembre de 2024

Funciones. Estadística

Puntuaciones típicas derivadas

Dado que las puntuaciones típicas (puntuaciones z) (pt en adelante) pueden ser de difícil interpretación, podemos expresar esta normalización de las puntuaciones de forma que resulte más fácilmente interpretable. Para ello utilizamos las puntuaciones típicas derivadas (pt_d en adelante). En esta entrada desarrollaré una función OOo Basic para su cálculo.


Sin entrar en demasiados detalles sobre conceptos estadísticos que no corresponden en este blog (1), diremos que una pt_d es la transformación de una pt, habiendo establecido a priori un valor para el promedio (md) de esa distribución y una desviación típica o estándar (dt en adelante). En función de la pt_d con que trabajemos, esos valores serán diferentes, pero el sistema o fórmula para el cálculo o conversión de la pt a pt_d es siempre el mismo aunque se puede expresar de formas diferentes: pt_d = dt * pt + med (2)

Son varias las escalas de puntuaciones típicas derivadas, aunque las usadas con más frecuencia son:
  • Las puntuaciones CI. md  100, dt  15
  • Las puntuaciones escalares (pe). md 10, dt 3 (límites 1-19)
  • Las puntuaciones T. md 50, dt 10
  • Las puntuaciones S (estaninos o eneatipos). md 5, dt 2 (límites 1-9)
  • Las puntuaciones decatipo. md 5.5, dt 2 (límites 1-10)
Partiendo de estas referencias, me propongo crear una función que calcule y devuelva (return) la puntuación típica derivada de una puntuación z (pt) (3). Este es el código de la función CalptDev()

Function CalptDev(pz As single, tipoptd As String) As Integer

Dim mPtDeriv() As String, mPtMed () As Single, mPtDt () As Integer
Dim i As Integer
Dim cat As String
Dim vPtDev

mPtDeriv() = Array ("CI","pe","T","S","Dc")
mPtMed () = Array(100,10,50,5,5.5)
 mPtDt () = Array(15,3,10,2,2)

Select Case tipoptd
Case = "CI"
cat = mPtDeriv(0)
Case = "pe"
cat = mPtDeriv(1)
Case = "T"
cat = mPtDeriv(2)
Case = "S"
cat = mPtDeriv(3)
Case = "Dc"
cat = mPtDeriv(4)
End Select

For i = 0 To UBound(mPtDeriv())
If cat = mPtDeriv(i) Then
vPtDev = pz * mPtDt (i) + mPtMed (i)
End If
Next

CalptDev = vPtDev

End Function

Como podemos ver, CalptDev() recibe dos parámetros (pz As single, tipoptd As String): el valor z (pt) a convertir en pt_d y el tipo de puntuación típica derivada (CI, T, S...)

Cuenta además con tres matrices (mPtDeriv(), mPtMed () mPtDt()) que contienen los datos de las puntuaciones típicas derivadas: identificador, promedio y desviación típica, los cuales son establecidos posteriormente mediante la función Array (v.g. mPtDeriv() = Array ("CI","pe","T","S","Dc")). También cuenta con tres variables: un contador (i) para correr el bucle For, una variable (cat) cuya función explico a continuación, y la variable que recogerá el resultado de la función (vPtDev) y que se asocia al return (CalptDev = vPtDev).

Lo primero que hacemos es concretar el tipo de escala asociando la variable cat  al contenido de la matriz mPtDeriv() en función del valor del parámetro tipoptd a mediante el condicional Select Case. De este modo hacemos uso de la matriz indicada para asignar contenido a la variable que nos permitirá establecer la equivalencia entre la entrada del citado parámetro con las posiciones de las matrices, usando (por segunda vez) la matriz mPtDeriv() como referencia.

Esto se desarrolla en la estructura For que sigue, mediante la cual, según el valor de cat, y en el momento en que sea igual al contenido de la matriz mPtDeriv(), y por medio de un condicional If (If cat = mPtDeriv(i) Then), se procede a aplicar la fórmula del cálculo de la puntuación típica derivada  pt_d = pt * dt + med (vPtDev = pz * mPtDt (i) + mPtMed (i)).

Obsérvese el uso de las matrices que contienen los valores dt y med (mPtMed () mPtDt()) y el papel que juega en este procedimiento el posicionamiento de los datos, o lo que es lo mismo, la importancia del contador i en este procedimiento. Es gracias a todo ello que podemos automatizar la correcta aplicación de los valores (dt y med) que corresponden sin necesidad de aplicar otras estructuras condicionales más complejas y, demás, de forma repetida.

Para facilitar el uso de esta función y ofrecer un modelo de funcionamiento concreto, muestro a continuación el código de un script de llamada y paso de parámetros a esta función. Observa que se utilizan procedimientos para la entrada dinámica de datos (4):

Sub ptDerivada

Dim pt As Single, pt_deriv As String, ptDer As Integer

pt = CSng(InputBox ("Puntuación z","Valor de la puntuación típica"))

pt_deriv = InputBox(" Puntuación CI (CI)" & Chr(13) & "Punt. escalar (pe)" & Chr(13) & "Punt. T (T)" & Chr(13) & "Punt S o estanino (S)" & Chr(13) & "Puntuación decatipo (Dc)","Escala o índice de la puntuación típica derivada","CI")

ptDer = CalptDev(pt,pt_deriv)

MsgBox ("Puntuación típica " &  pt & CHr(13) & "Puntuación " & pt_deriv & " " & ptDer,0,"PUNTUACIÓN TÍPICA DERIVADA")

End Sub


NOTAS

(1) Sobre el tema se pueden consultar otras fuentes en la web. Entre otras recomiendo por su corrección y sencillez expositiva [A Ruiz Bueno (UB)] a título de introducción al tema.
(2) Otra fórmula en que es frecuente expresar esta transformación es pt_d = med +/- pt * dt. el uso de los signos alternativos +/- hace referencia a que del resultado de la operación pt * dt puede resultar un valor positivo, si pt es +pt, o negativo si es -pt; esto es: si la puntuación z (valor concreto de pt[ver entrada anterior] deriva de una puntuación directa superior o inferior a la media grupal.
(3) Aunque no se trata de crear ahora un docap, sí será necesario crear un script simple que llame a la función, ya que, como sabemos, las funciones no devuelven nada si no son llamadas desde un script, subrutina u otra función.
(4) IMPORTANTE: el valor de la puntuación z que se solicita asociado a la variable pt, (pt = CSng(InputBox ("Puntuación z","Valor de la puntuación típica"))) que será muy probablemente un valor decimal y debe escribirse separando por coma la unidad de la parte decimal; la función de conversión CSng() se encarga de convertir este valor (String) en Single. NO se debe emplear el punto como separador, ya que provoca un resultado incorrecto.