IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[E-07] matrice de corrélation (débutant)


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 35
    Par défaut [E-07] matrice de corrélation (débutant)
    Salut,
    je dois calculer une matrice des corrélations. j'ai écrit un code mais ça ne marche pas, enfin celui de la matrice des corrélations. en fait je crée un tableau et à partir de celui ci déterminer la matrice des covariances et des corrélations. si je pouvais avoir un p'tit coup de main svp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Function matrice_covariance(T, n, p) As Long
    Dim COV() As Integer
    Dim MC() As Integer
    Dim k As Integer
    Dim l, i As Integer
    Dim s As Long
     
    ReDim COV(1 To p, 1 To p) As Integer
    ReDim MC(1 To p) As Integer
    For k = 1 To p
     
    For l = 1 To p
     
    s = 0
     
    For i = 1 To n
     
    s = s + T(i, k) * T(i, l)
     
    Next i
     
    COV(k, l) = s \ n - MC(k) * MC(l)
     
    matrice_covariance = COV(k, l)
     
    Next l
     
     
    Next k
     
    End Function
    __________________________

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Sub matrice_correlation(n, p As Integer)
    
    Dim COR() As Integer
    Dim j, i As Integer
    Dim COV() As Integer
    Dim ET_L() As Integer
    Dim ET_C() As Integer
    Dim k, l As Integer
    
    ReDim COR(1 To p, 1 To p) As Integer
    ReDim COV(1 To p, 1 To p) As Integer
    ReDim ET_L(1 To n) As Integer
    ReDim ET_C(1 To p) As Integer
    
    
    For i = 1 To n
    
    For j = 1 To p
    
    
    
    COR(i, j) = COV(i, j) \ ET_L(i) * ET_C(j) ça bloque à ce niveau
    Next j
    
     
    Next i
    
    End Sub

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Il me semble que dans la procédure matrice_correlation les 4 tableaux utilisés sont des variables locales sans valeurs.
    Si l'objectif est de calculer la covariance, pourquoi ne pas utiliser les fonction de feuille correspondante?

    Cordialement,

    PGZ

  3. #3
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 35
    Par défaut
    bonsoir, ben les tableaux contiennenet des résultats calculés dans des fonctions antérieures. donc je voulais en qquesorte appeler le résultat de ces tableaux pr calculer ma matrice des corrélations. mais là j'avoue être perdu.

  4. #4
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Re,

    Eh bien j'imagine qu'au départ il y a 2 matrices, puis des tableaux de travail.
    Dans matrice_covariance on voit le remplissage de COV, mais ça ne doit pas être terrible car MC est une variable locale et certainement vide (tout élément = 0 puisque de type integer).
    Dans matrice_correlation, 4 tableaux tous vides. L'erreur d'exécution doit être une division par 0.
    Pour qu'une variable prérenseignée soit utilisable dans une sous procédure il faut :
    - soit que la variable soit publique
    - soit qu'elle soit passée en paramètre.

    Tu as un gros pb de structure de ton programme. Tu pourrais regarder les tutaux sur procédures et fonctions.

    EN espérant que cela puisse t'aider et cordialement,

    PGZ

  5. #5
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 35
    Par défaut
    alors j'ai revu les points que tu as souligné, j'ai corrigé pour mes autres fonctions et ça fonctionne. maintenant c'est au niveau de la formule de calcul de la covariance que ça ne va pas. MC(k) et MC(l) = 0

  6. #6
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Tu peux montrer où tu en es de ton code?

    PGZ

  7. #7
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 35
    Par défaut
    ben ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Function matrice_covariance(T, n, p As Integer, MC_k() As Single, MC_l() As Single, COV() As Single) As Single
     
    Dim k As Integer
    Dim l, i As Integer
    Dim s As Long
     
    ReDim MC_k(1 To p) As Single
    ReDim MC_l(1 To p) As Single
    ReDim COV(1 To p, 1 To p) As Single
     
    For k = 1 To p
     
    For l = 1 To p
     
    s = 0
     
    For i = 1 To n
     
    s = s + T(i, k) * T(i, l)
     
    Next i
     
    COV(k, l) = s \ n - MC_k(k) * MC_l(l)
     
    matrice_covariance = COV(k, l)
     
    Next l
     
    Next k
     
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub matrice_correlation(n, p As Integer, COR() As Single, COV() As Single, ET_L() As Single, ET_C() As Single)
     
    Dim j, i As Integer
    Dim k, l As Integer
     
     
     
    ReDim ET_L(1 To n) As Single
    ReDim ET_C(1 To p) As Single
    ReDim COR(1 To p, 1 To p) As Single
     
    For i = 1 To n
     
    For j = 1 To p
     
     
     
    COR(i, j) = COV(i, j) \ ET_L(i) * ET_C(j)
     
    Next j
     
    Next i

  8. #8
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Quand tu fais Redim, sans l'option Preserve, tu perds les données des tableaux. Elles te servent à quoi ces instructions Redim?

    Tu peux montrer aussi un bout de code appelant ces procédures?

    PGZ

  9. #9
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 35
    Par défaut
    l'option Preserve, je connais pas. pardonnez mon ignorance !

    hum oui redim est inutile là sauf pour COR et COV.

    j'ai une procédure principale ds laquelle je crée une matrice et j'appelle toutes les autres fonctions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Sub affiche_matrice()
     
        Dim T_local() As Integer 'Déclaration d'une matrice d' entiers
        Dim i As Integer
        Dim j As Integer
        Dim n_string As String
        Dim n As Integer
        Dim p_string As String
        Dim p As Integer
        Dim MC_k() As Single
        Dim MC_l() As Single
        Dim ML() As Single
        Dim VL() As Single
        Dim COV() As Single
        Dim COR() As Single
        Dim ET_L() As Single
        Dim ET_C() As Single
     
     
     
        n = CInt(InputBox("Donnez le nombre de lignes du tableau", "nombre de lignes", "4"))
          'Affiche une boite de dialogue ayant pour texte : "Donnez..."
            'ayant pour titre : "Nombre de  ..." et proposant comme valeur par défaut 5
            'on recupère le nombre de lignes n en faisant une conversion avec Cint
     
            p = CInt(InputBox("donnez le nombre de colonnes du tableau", "nombre de colonnes", "3"))
            'meme chose  que pour les lignes mais avec les colonnes
        ReDim T(1 To n, 1 To p) As Integer
         'On dimensionne la matrice: lignes(1 à n) et colonnes (1 à p)'
     
        For j = 1 To p
     
     
         For i = 1 To n
     
        T(i, j) = InputBox("saisir les valeurs du tableau", "Valeur du tableau", "")
     
            Worksheets("Feuil1").Cells(i + 6, j + 2).Value = T(i, j)
            Worksheets("Feuil1").Cells(i + 6, j + 2).Font.ColorIndex = 3
            Worksheets("Feuil1").Cells(i + 6, j + 2).Borders.ColorIndex = 1
     
     
     
     
     
        Next i
       Next j
       Call moyenne_ligne(T, n, p, ML)
     
       Call variance_ligne(T, n, p, ML, VL)
     
       Call ecart_type_ligne(T, n, p, VL, ET_L)
     
       Call moyenne_colonnes_k(T, n, p, MC_k)
     
       Call moyenne_colonnes_l(T, n, p, MC_l)
     
       Call matrice_covariance(T, n, p, MC_k, MC_l, COV)
     
       Call matrice_correlation(n, p, COR, COV, ET_L, ET_C)
     
     
    End Sub

  10. #10
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    RE,

    OK. On va mettre au clair la première procédure, moyenne_ligne. Tu peux montrer son code?

    PGZ

  11. #11
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 35
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Function moyenne_ligne(T, n, p As Integer, ML() As Single) As Single
     
     
    Dim i As Integer
    Dim j As Integer
    Dim s As Integer
     
    ReDim ML(1 To n) As Single
    For i = 1 To n
     
    s = o
     
    For j = 1 To p
     
    s = s + T(i, j)
     
    Next j
     
    ML(i) = s \ p
     
    moyenne_ligne = ML(i)
     
    Next i
     
    End Function
    et merci de bien vouloir m'aider.

  12. #12
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Dans la procédure d'appel affiche_matrice, tu renseignes le tableau T(), mais je n'ai pas vu sa déclaration.

    moyenne_ligne, si je comprends, a pour but de remplir le tableau ML, qui lui est bien déclaré et passé en argument.

    moyenne_ligne en fonction renvoie la dernière valeur de ML, soit ML(n). A mon avis cela ne sert à rien. En fait moyenne_ligne est un sub qui pourrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub moyenne_ligne(ByRef T() As Integer, ByRef ML() As Single)
     
    Dim i As Integer, j As Integer
    Dim n As Integer, p As Integer
    Dim s As Integer
     
    n = UBound(T, 1)
    p = UBound(T, 2)
     
    ReDim ML(1 To n) As Single
     
    For i = 1 To n
        s = 0
        For j = 1 To p
            s = s + T(i, j)
        Next j
        ML(i) = s \ p
    Next i
     
    End Sub
    n et p n'ont pas besoin d'être passés en argument, ce sont les dimensions de T.
    J'ai suposé que T() est un tableau d'entiers.
    Si les ML(i) = s\p, pourquoi le type ML n'est pas entier?

    Tu peux peut-être essayer de faire marcher cela, en vérifiant ML, puis on peut passer à variance_ligne.

    PGZ

  13. #13
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 35
    Par défaut
    effectivement, T() est un tableau d'entiers donc le résultat devrait être de type entier , dc ML() doit etre de type integer aussi ?

    j'ai testé ton code et celà fonctionne.

    mais ByRef signifie quoi ? Et UBound correspond à quoi ? je n'ai pas vu celà en cours. A la base je suis en éco.

  14. #14
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    A mon avis ML est de type entier car tu le renseignes en calculant s\p, ce qui est une division entière.

    Les fonctions lBound et Ubound te donnent les indices min et max d'un tableau. N'hésite pas à regarder l'aide (F1)!

    AS-tu bien compris pourquoi moyenne_ligne devait être un sub et pas une fonction?

    Dans une procedure ou une fonction, les arguments sont passés en référence ou en valeur. Quand on ne précise pas, c'est par réference par défaut. MAis il faut se méfier des déclarations par défaut... Regardes les tutos sur les procedures et fonctions VBA...

    PGZ

  15. #15
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 35
    Par défaut
    la fonction renvoie uniquement la dernière valeur , c'est ça ?

    j'ai regardé sur le net la différence entre la procédure et la fonction.

    et dc pour variance_ligne, je dois procéder de la même manière que pour moyenne_ligne ?

  16. #16
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Oui, tu dois faire pareil.
    Si tu veux tu peux montrer ensuite ta procedure pour vérif...

    PGZ

  17. #17
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 35
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    sub variance_ligne(ByRef T() As Integer, ByRef ML() As integer, ByRef VL() As integer)
     
    Dim i As Integer, j As Integer
    Dim n As Integer, p As Integer
    Dim s As Long
     
    n = UBound(T, 1)
    p = UBound(T, 2)
     
    ReDim VL(1 To n) As integer
     
     
      For i = 1 To n
     
      s = 0
     
     For j = 1 To p
     
      s = s + T(i, j) * T(i, j)
     
     
     Next j
     
     VL(i) = s \ p - ML(i) * ML(i)
     
     Next i
     
    End Sub

  18. #18
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Ca paraît bien.
    Tu as de bons résultats dans VL?

    PGZ

  19. #19
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 35
    Par défaut
    la feuille excel ne rend pas les mêmes résultats ! en même tps là, on ne prend en compte que les nombres entiers...

    je poursuis sur le meme principe avec mes autres procédures. puis-je te montrer ce que ça donne ?

  20. #20
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Oui, bien sûr.

    A toi de voir si cela a un sens de travailler avec des coef entiers ou s'il faut des réels. Mais dans ce cas, pas de division entière...

    PGZ

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Matrice centré reduite et matrice des corrélations
    Par clement1990 dans le forum SAS STAT
    Réponses: 4
    Dernier message: 13/11/2017, 10h05
  2. Réponses: 1
    Dernier message: 02/02/2012, 17h22
  3. matrice de corrélation et ses coefficients
    Par malikakika dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 08/02/2009, 19h11
  4. matrice de corrélation sous VBA Excel
    Par fox971 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 09/11/2008, 22h15
  5. Matrice des corrélations
    Par fafabzh6 dans le forum SAS STAT
    Réponses: 0
    Dernier message: 30/07/2008, 14h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo