Nous allons profiter de la résolution de ce problème pour nous familiariser avec un système de calcul formel : le module SymPy du logiciel que nous allons utiliser dans ce cours, Python.
Nous commençons par « lancer » Python
de la façon la plus simple, en tapant en ligne de commande :
python
Nous chargeons ensuite le module Sympy
:
import sympy as sy
Nous définissons ensuite les variables M
, m
, N
, n
et theta
comme des symboles avec :
M, m, N, n, theta = sy.symbols('M m N n theta')
Pour avoir l'impression la plus « jolie » possible avec notre terminal nous évaluons la fonction init_printing avec :
sy.init_printing()
Nous pouvons maintenant définir notre fonction de vraisemblance :
L = theta**(m+2*n)*(1-theta)**(M-m)*(1-theta**2)**(N-n)
Un appel à la version symbolique de la fonction log
nous donne après un « petit » traitement supplémentaire une version « agréable » de la log-vraisemblance :
l = sy.expand_log(sy.log(L),force=True)
Le petit traitement est effectué par la fonction expand_log et le paramètre formel optionnel force=True
dit au système de ne pas se poser de questions (sur le valeur de theta
) et de faire le développement comme si il avait le droit de le faire.
Un appel à la fonction diff nous donne alors la fonction score :
S = sy.diff(l,theta)
La réponse à la première partie de la question est alors obtenue en combinant simplify et collect :
S = sy.collect(sy.simplify(S),theta)
Pour trouver l'expression analytique de $\hat{θ}$ nous devons extraire le numérateur avec la fonction fraction :
S_num = sy.fraction(S)[0]
L'expression analytique de $\hat{θ}$ est finalement obtenue avec un appel à la fonction solve :
sy.solve(S_num,theta)
Dans l'énoncer de la partie (b) on nous dit que M = N = 100, m = 11 et n = 2. La méthode subs nous permet de substituer ces valeurs numériques dans nos expressions :
solution = [exp.subs([(M,100),(m,11),(N,100),(n,2)])
for exp in sy.solve(S_num,theta)]
Ici, nous avons employé une liste en compréhension une possibilité très pratique de la syntaxe de Python. Pour « forcer » une conversion des expressions rationnelles obtenues vers des réels représenté en double précision, il faut utiliser la méthode evalf :
solution[1].evalf()
Si nous n'utilisons que les données de l'échantillon ♂, nous obtenons :
(m/M).subs([(M,100),(m,11)]).evalf()
Alors que si nous n'utilisons que les données de l'échantillon ♀, nous obtenons :
sy.sqrt(n/N).subs([(N,100),(n,2)]).evalf()