Función para el cálculo de la media aritmética (promedio)
Dado que OOo Basic no cuenta con funciones integradas para el cálculo de valores estadísticos, nos vemos obligados a recurrir a las funciones Calc o a crearlas nosotros mismos (1).
Si optamos por crear nuestras propias funciones estadísticas, en este caso una función que devuelva la media aritmética de un conjunto de datos, deberemos resolver previamente previamente el problema del acceso a los datos, cuestión que se trata [en esta entrada], obviamente fundamental, pero ajena al objetivo de la presente (2): lo que aquí nos proponemos es crear una función que, recibiendo como parámetro una matriz de datos, devuelva (Return) el valor de la media aritmética (promedio). Para ello esta función deberá ejecutar la siguiente fórmula, replicando lo que realiza la función PROMEDIO() incluida en Calc (3)
Si damos por resuelto el accedo a la matriz de datos, nuestra función debe declararse conformada al menos por un parámetro de tipo numérico y formulado como matriz: Function fPromedio (mdatos() As Object) As Double, podría ser una formulación válida.
Esta función deberá contar con una serie de variables, todas ellas numéricas:
- Dos para trabajar con la fórmula: una para contener el valor del sumatorio (vSum As Long) y otra (opcional) para contener el valor de N (vN As Integer)
- Una (opcional) para contener el valor a retornar (vMed As Double)
- Y una más (i As Integer) como contador.
For i = 0 To UBound(mDatos())vSum = vSum + mDatos(i)Next
El valor de N es más sencillo: es equivalente al valor de i al finalizar el recorrido del bucle, por lo que vN = i sería suficiente (5). que los lo que nos debemos plantear, en primer lugar, es cómo obtener el sumatorio de los mismos, esto es: el valor del numerador de la fracción de la fórmula anterior.
Para finalizar, directamente sobre el Return, podemos ejecutar la última instrucción que nos permite calcular el promedio de los valores: fPromedio = vSum/vN (6), aunque por claridad y por motivos didácticos, posiblemente sea preferible diferenciar el proceso en dos instrucciones:
- Primero calculamos el valor de la media: vMed = vSum/vN
- Y después realizamos el Return: fPromedio = vMed
En resumen, la función podría quedar como sigue:
Function fPromedio(mDatos() As Object) As Double
Dim vSum As Long
dim vN As Integer, i As Integer
Dim vMed As Double
vSum = 0
vN = 0
For i = 0 To UBound(mDatos())
vSum = vSum + mDatos(i)
Next
vN = i
vMed = vSum/vN
fPromedio = vMed
End Function
NOTAS
(1) Esta afirmación se basa en el análisis de la información accesible en la red. En realidad OOo Basic no cuenta con funciones Built-In para la mayoría de las funciones Calc, aunque es factible incorporar estas funciones dentro del código. El uso de las funciones Calc en script OOo Basic se trata en [esta entrada]. Esta solución es posiblemente la más económica en términos de esfuerzo de programación, pero no necesariamente la más funcional ni la mejor integrada en el proceso de programación.
(2) Podemos considerar que esta cuestión debe abordarse en el script que llama a nuestra función, lo que no implica que sea ajena a la formulación y el uso de funciones o subrutinas que tienen específicamente ese cometido: facilitar el acceso a una colección de datos almacenada en una hoja de cálculo.
(3) En inglés AVERAGE(), que será la expresión a emplear en caso que integrar dicha función Calc dentro de un script. Respecto a PROMEDIO() [ver esta entrada]
(4) Este supuesto responde a la práctica normal, que permite la potencia de cálculo de los medios informáticos actuales. En el supuesto de que lo estuvieran, cambiarían las condiciones de partida, ya que o bien tenemos una matriz bidimensional o bien trabajamos con dos matrices pareadas (una con los valores y; otra con las frecuencias f(y)). En este supuesto también se modifica la fórmula del cálculo, incluyendo la expresión y * f(y) en el numerador, producto sobre el que se realiza el sumatorio.
(5) También podemos resolverlo incluyendo la expresión vN = vN + i dentro del bucle y ya fuera de él añadir la instrucción vN = vN + 1. Esta corrección final es necesaria porque i dentro del bucle vale tanto como UBound(mDatos()) y ese índice se queda una unidad por debajo del valor real de N-fórmula al iniciar las matrices en la posición 0. Como se puede ver, la primera solución es mucho más sencilla, incluso se puede utilizar i como equivalente a vN y operar directamente con esta variable en la instrucción final de la función (ver texto de la entrada).
(6) O su equivalente fPromedio = vSum/i