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

Méthodes prédictives Discussion :

Prédiction de la valeur suivante d'une série chronologique


Sujet :

Méthodes prédictives

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Prédiction de la valeur suivante d'une série chronologique
    bonjour,

    Le document (telechargeable en bas du message) explique comment on peut estimer la valeur qui va suivre dans une série chronologique donnée. Après avoir copié collé le code dans une macro sur excel et rentré une série donnée, la valeur prédite est toujours à 0 quelque soit le nombre de donnée ou le nombre d'équations introduits. Après avoir cherché le problème, tout ce que j'ai trouvé c'est que la matrice XD est toujours nulle, car bien évidemment les valeurs que cette matrice comporte sont inconnues (donc =0 sur excel). Je ne comprends pas trop comment je peux modifier ce code afin qu'il puisse me donner des résultats plus satisfaisants. Merci de m'éclairer là dessus.

    Voici le document en question : http://www.sciencedirect.com/science...98122108004276

    Voici le code VBA à copier coller si vous voulez l'essayer sur excel :
    Code vba : 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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    Sub Deterministic_Regression()
        Dim i As Long, j As Long, k As Long, h As Long, ll As Long
        Dim Cont As Double, Cont2 As Double, Cont3 As Double, Cont4 As Double, Cont5 As Double
    'r(1) is the number of independent observations in the regression (the base length)
    's is the number of simultaneous equations in system (5), Section 2.1
    'X = {yi, yi+1, . . . , yi+r-1}, i = j, j + 1, . . . , dim X = r, is the row vector of sliding observations in (2), (3)
    'at right, - not the same notation as in (5)
    'A is the vector of coefficients ai in the regression (3), (5)
        Dim r() As Integer: ReDim r(2): Dim s As Integer
    r(1) = 6
    s = 1
        Dim X() As Double, A() As Double
        ReDim X(10000): ReDim A(r(1))
    'Download form Excel X(1), . . . X(r + s), . . .
        For i = 1 To 10000
            X(i) = Cells(9 + i, 2)
        Next i
    'Construct the matrix XU, such that (XU)(A)t = (X(r + 1), . . . X(r + s))t. t = ‘‘transpose’’
        Dim XU() As Double: ReDim XU(s, r(1))
        For i = 1 To s
            For j = 1 To r(1)
    XU(i, j) = X(i + j - 1)
            Next j
        Next i
     '   Construct the matrix XD = (X(r(1) + 1), . . . X(r(1) + s))t, t = ‘‘transpose’’
        Dim XD() As Double: ReDim XD(s)
        For i = 1 To s
        XD(i) = X(r(1) + i)
        Next i
    'Square (r(1), r(1)) system leading to the orthogonal projection of XD
    'Z(A)t = Z(-, 0) is called System_1 and indicates that(XU)(A)t is the orthogonal projection of XD
        Dim Z() As Double: ReDim Z(r(1), r(1))
        For i = 1 To r(1)
            For j = 1 To s
    Z(i, 0) = Z(i, 0) + XD(j) * XU(j, i)
            Next j
            For j = 1 To r(1)
                For k = 1 To s
    Z(i, j) = Z(i, j) + XU(k, i) * XU(k, j)
                Next k
            Next j
        Next i
    'System_2 computes the kernel of XU, (XU)(A)t = 0
    'Making system_2 diagonal
        For i = 1 To r(1): XU(0, i) = i: Next i
        Cont = 0
        ll = s
        If ll > r(1) Then ll = r(1)
        For i = 1 To ll
            k = i
    Do While k <= r(1) And Cont = 0
                For j = i To s
                    If XU(j, k) <> 0 Then Cont = Cont + 1
                Next j
                If Cont <> 0 Then
                    For h = 0 To s
                        Cont2 = XU(h, i): XU(h, i) = XU(h, k): XU(h, k) = Cont2
                    Next h
                End If
                k = k + 1
            Loop
            j = i
            Do While j < s And XU(j, i) = 0
                j = j + 1
            Loop
            For k = 1 To r(1)
                Cont2 = XU(i, k): XU(i, k) = XU(j, k): XU(j, k) = Cont2
            Next k
            Cont3 = XU(i, i)
            If Cont3 <> 0 Then
                For k = 1 To r(1)
                    XU(i, k) = XU(i, k) / Cont3
                Next k
                j = i + 1
    Do While j <= s
                    Cont2 = XU(j, i)
                    For k = 1 To r(1)
    XU(j, k) = XU(j, k) - Cont2 * XU(i, k)
                    Next k
                    j = j + 1
                Loop
            End If
            Cont = 0
        Next i
    'Dimension of the Kernel. s-ll will denote the required dimension
        Cont = 0: Cont2 = 0
        i = s
        Do While Cont = 0 And i >= 1
            For j = 1 To r(1)
                If XU(i, j) <> 0 Then Cont = Cont + 1
            Next j
            If Cont = 0 Then Cont2 = Cont2 + 1
    i = i - 1
        Loop
        ll = Cont2
    'Making the diagonal of the new (XU) equal one
    For i = 1 To s - ll
            Cont4 = XU(i, i)
            For j = 1 To r(1)
                XU(i, j) = XU(i, j) / Cont4
            Next j
        Next i
    'Making terms over the diagonal of the new (XU) vanish
    For i = s - ll To 1 Step -1
    k = i - 1
            Do While k > 0
                Cont = XU(k, i)
                For j = 1 To r(1)
    XU(k, j) = XU(k, j) - XU(i, j) * Cont
                Next j
    k = k - 1
            Loop
        Next i
    'Basis of the kernel of (XU)
    Dim Basis_K() As Double: ReDim Basis_K(r(1) - s + ll, r(1))
        For j = 1 To r(1)
            Basis_K(0, j) = XU(0, j)
        Next j
    For j = s - ll + 1 To r(1)
    For i = 1 To r(1) - (s - ll)
    If i = j - (s - ll) Then Basis_K(i, j) = 1
    Next i
        Next j
    For i = 1 To r(1) - (s - ll)
    For j = 1 To s - ll
    Basis_K(i, j) = -XU(j, s - ll + i)
            Next j
        Next i
    'Reorganizing Basis_K() so as to have the natural orderA1, . . . , Ar
        For j = 1 To r(1)
            i = j
            Do While Basis_K(0, i) <> j
                i = i + 1
            Loop
    For k = 0 To r(1) - (s - ll)
                Cont = Basis_K(k, j): Basis_K(k, j) = Basis_K(k, i): Basis_K(k, i) = Cont
            Next k
        Next j
        'System_3 is obtained by adjoining system_1 and system involving Basis_K(). System_3 simultaneously imposes (XU)(A)t to
    'be the orthogonal projection of (XD) and (A) to be orthogonal to the kernel
    Dim ZZ() As Double: ReDim ZZ(2 * r(1) - (s - ll), r(1))
        For j = 1 To r(1): ZZ(0, j) = j: Next j
        For i = 1 To r(1)
            For j = 0 To r(1)
                ZZ(i, j) = Z(i, j)
            Next j
        Next i
    For i = r(1) + 1 To 2 * r(1) - (s - ll)
            For j = 1 To r(1)
    ZZ(i, j) = Basis_K(i - r(1), j)
            Next j
        Next i
    'Making system_3 diagonal. The system has a unique solution, so not needed rows are deleted
        For i = 1 To r(1): ZZ(0, i) = i: Next i
        Cont = 0
        i = 1
    Do While i <= r(1)
            k = i
    Do While k <= r(1) And Cont = 0
    For j = i To 2 * r(1) - (s - ll)
                    If ZZ(j, k) <> 0 Then Cont = Cont + 1
                Next j
                If Cont <> 0 Then
    For h = 0 To 2 * r(1) - (s - ll)
                        Cont2 = ZZ(h, i): ZZ(h, i) = ZZ(h, k): ZZ(h, k) = Cont2
                    Next h
                End If
                k = k + 1
            Loop
            j = i
    Do While j < 2 * r(1) - (s - ll) And ZZ(j, i) = 0
                j = j + 1
            Loop
            For k = 0 To r(1)
                Cont2 = ZZ(i, k): ZZ(i, k) = ZZ(j, k): ZZ(j, k) = Cont2
            Next k
            Cont2 = ZZ(i, i)
            For k = 0 To r(1)
                ZZ(i, k) = ZZ(i, k) / Cont2
            Next k
            j = i + 1
    Do While j <= 2 * r(1) - (s - ll)
                Cont2 = ZZ(j, i)
                For k = 0 To r(1)
    ZZ(j, k) = ZZ(j, k) - Cont2 * ZZ(i, k)
                Next k
                j = j + 1
            Loop
            Cont = 0
            i = i + 1
        Loop
        'Solving system_3
        For i = r(1) To 1 Step -1
            A(i) = ZZ(i, 0)
            j = r(1)
            Do While j > i
    A(i) = A(i) - ZZ(i, j) * A(j)
    j = j - 1
            Loop
        Next i
    'Organizing system_3 to retrieve the natural order A(1), A(2), . . ..
        For j = 1 To r(1)
            i = j
            Do While ZZ(0, i) <> j
                i = i + 1
            Loop
            For k = 0 To r(1)
                Cont = ZZ(k, j): ZZ(k, j) = ZZ(k, i): ZZ(k, i) = Cont
            Next k
        Next j
    'Vector A (regression coefficients)
        For i = 1 To r(1)
            Cells(10 + i, 5) = A(i)
        Next i
    'Y, state variable estimate, and the deviations X - Y and (X - Y)/X
    'Variable rr is the horizon of forecasting
        Dim Y() As Double: ReDim Y(10000)
        Dim rr As Long
    rr = 1
        For i = 1 To rr
            For j = 1 To r(1)
    Y(r(1) + i) = Y(r(1) + i) + A(j) * X(j + i - 1)
            Next j
            Cells(r(1) + i + 10, 8) = Y(r(1) + i)
    Cells(r(1) + i + 10, 9) = X(r(1) + i) - Y(r(1) + i)
    If X(r(1) + i) <> 0 Then Cells(r(1) + i + 10, 10) = Abs((Cells(r(1) + i + 9, 2) - Y(r(1) + i))) * 100 / Cells(r(1) + i + 9, 2)
        Next i
    End Sub

  2. #2
    Membre éprouvé

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Points : 1 189
    Points
    1 189
    Billets dans le blog
    2
    Par défaut
    Bonjour Mehdi,

    Ton lien n'est pas accessible.

    Si quelqu'un souhaite de corriger ton code VBA, tu trouveras de l'aide, je pense, dans le forum concerné. Quelle méthode utilises-tu pour tes prévisions et comment veux tu la résoudre ?

    Cordialement.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par dev_ggy Voir le message
    Bonjour Mehdi,

    Ton lien n'est pas accessible.

    Si quelqu'un souhaite de corriger ton code VBA, tu trouveras de l'aide, je pense, dans le forum concerné. Quelle méthode utilises-tu pour tes prévisions et comment veux tu la résoudre ?

    Cordialement.
    Bonjour,

    Merci pour ta réponse, j'ai rectifié le lien.

    Alors voilà, Le code lit d'abord les valeurs de la série à partir de la cellule (10,2) et les affecte à X(i). Prenons par exemple une série où j'ai 35 valeurs, et je veux tester la fiabilité du code, donc comparer les résultats donnés à des valeurs que j'ai mesuré. On pose r(1)=15, en exécutant la macro on estimera la 16ème valeur. quand on autorise la boucle a lire toutes les valeurs, on obtient un résultat (dont la qualité dépend du s choisit). mais quand on ne lui autorise que la lecture des 15 premières valeurs:

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To r(1)
    X(i) = Cells(9 + i, 2)
    Next i

    on obtient 0. Ce que je ne comprends pas c'est que ce code est censé donner une estimation sans être au courant des valeurs suivantes. Et quand on regarde la formule finale du y, on voit que le 0 obtenu est à cause de XD, qui est par définition la matrice colonne des valeurs venant après r(1) :

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ' Construct the matrix XD = (X(r(1) + 1), . . . X(r(1) + s))t, t = ‘‘transpose’’
    Dim XD() As Double: ReDim XD(s)
    For i = 1 To s
    XD(i) = X(r(1) + i)
    Next i

    Où est l'erreur dans ce raisonnement ?

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/01/2014, 10h26
  2. Prévoir valeur suivante d'une série de nombres
    Par ArnaudFu13 dans le forum MATLAB
    Réponses: 8
    Dernier message: 23/11/2012, 17h29
  3. Recupérer la valeur suivante qu'une sequence
    Par MickSou dans le forum DB2
    Réponses: 2
    Dernier message: 29/09/2011, 15h54
  4. recherche de la valeur maximum dans une série de cellules
    Par Lechette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/04/2008, 08h33
  5. Comment trouver les valeurs manquante d'une série ?
    Par NicoNGRI dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/10/2006, 09h38

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