RégressionS linéaires de plusieurs ordre

totaljim

XLDnaute Nouveau
Bonjour le forum !!!

Bon ce matin je bloque un peu
voila je souhaite faire des régressions : linéaire dans un premier temps puis polynomiales dans un deuxième temps, j'augmente l'ordre du polynome jusqu'a l'ordre 5.
Je récupère a chaque régression, le coefficient R² correspondant que je stock dans un tableau : montab(ordre)
Enfin je regarde quel coeff R² dans mon tableau est le plus grand et j'affiche sur ma feuille l'ordre, mle R² et la courbe correspondante, et je vire tout les autres.

Le problème c'est que
l'incide n'appartient pas à la sélection
dans mon tableau
l'erreur vient de cette ligne

VB:
montab("" & ordre) = rdeux
j'avais essayé
VB:
montab(ordre) = rdeux
Meme erreur dans les 2 cas.

Je vous mets le code de ce module ci dessous bien que je n'ai besoin d'aide que sur la partie mettre les données dans le tableau. Enfin pour le moment ;)

VB:
Sub recap()
Dim montab() As Double
rang3 = Worksheets("DonnéesCorrélations").UsedRange.Rows.Count

' Supprimer anciens graphs '
        For Each Legraphe In ActiveSheet.ChartObjects
            Legraphe.Delete
        Next

' Boucle afin de faire TOUT les graph

For k = 1 To 2
i = 1
li = 2
col = 1
    For l = 1 To 4
        For m = 1 To 5
        
    ' Ajouter nouveau graph '
            ActiveSheet.Shapes.AddChart.Select
            
    ' Supprimer séries déjà affichées '
            Do Until ActiveChart.SeriesCollection.Count = 0
                ActiveChart.SeriesCollection(1).Delete
            Loop
           
    ' Choix type de courbe '
            ActiveChart.ChartType = xlXYScatterLines
                
    ' Choix et ajout des séries '
            ActiveChart.SeriesCollection.NewSeries
            ActiveChart.HasTitle = True
                abscisse k, l
                ordonnée m
                
    ' Facteur de corrélation '
For ordre = 1 To 5
    If ordre = 1 Then
        ActiveChart.SeriesCollection(1).Trendlines.Add
        ActiveChart.SeriesCollection(1).Trendlines(ordre).Select
        Selection.DisplayRSquared = True
        rdeux = Right(ActiveChart.SeriesCollection(1).Trendlines("" & ordre).DataLabel.Text, 6)
        'MsgBox rdeux
        montab("" & ordre) = rdeux
    Else
        ActiveChart.SeriesCollection(1).Trendlines.Add
        ActiveChart.SeriesCollection(1).Trendlines("" & ordre).Select
        With Selection
            .Type = xlPolynomial
            .Order = 2
        End With
        Selection.DisplayRSquared = True
        rdeux = Right(ActiveChart.SeriesCollection(1).Trendlines("" & ordre).DataLabel.Text, 6)
        montab("" & ordre) = rdeux
    End If
        
Next

For ordre = 1 To 5
MsgBox montab(ordre)
Next

            'Range("F" & li + 4).Value = ActiveChart.SeriesCollection(1).Trendlines(1).DataLabel.Text
               
    ' Mise en place des graphiques '
    If k = 1 Then
                With Worksheets("Récapitulatif")
                    .ChartObjects(i).Top = .Rows(li).Top
                    .ChartObjects(i).Left = .Columns(col).Left
                    .ChartObjects(i).Height = 165.75
                    .ChartObjects(i).Width = 300
                End With
    Else
                With Worksheets("Récapitulatif1")
                    .ChartObjects(i).Top = .Rows(li).Top
                    .ChartObjects(i).Left = .Columns(col).Left
                    .ChartObjects(i).Height = 165.75
                    .ChartObjects(i).Width = 300
                End With
    End If
i = i + 1
li = li + 13
        Next
    Next
    Worksheets("Récapitulatif1").Select
Next

End Sub
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : RégressionS linéaires de plusieurs ordre

Bonsour®
La remarque en bas de page du lien que je cite dans mon précédent message est-elle fondée ou pas ?

tu as tout à fait raison de rebondir sur ce point...
je ne suis pas expert en mathématiques, mais j'avais déjà souvent constaté des différences selon les méthodes de calculs
cette fonction EXCEL ne semble exacte que dans le cas de régression LINEAIRE

différences également quand on calcule les coefficients dans une régression polynomiale... :(

les concepteurs EXCEL se serait donc permis quelques latitudes avec les mathématiques :eek:
 

ROGER2327

XLDnaute Barbatruc
Re : RégressionS linéaires de plusieurs ordre

Bonjour à tous.


(...)
Quelqu'un sait il récupérer le coefficient de régression ?
Rien de plus simple :
Tout ce qui est nécessaire au calcul du coefficient de régression pour un ajustement polynomial de degré donné est dans l'aide associée à la fonction DROITEREG. En prime, on a les coefficients du polynôme.​


Bonne journée.


ℝOGER2327
#7706


Samedi 14 Sable 142 (Don Quichotte, champion du monde - fête Suprême Quarte)
24 Frimaire An CCXXIII, 1,0206h - oseille
2014-W50-7T02:26:58Z
 

Pièces jointes

  • Ajustement polynomial par la fonction DROITEREG.xlsx
    14.4 KB · Affichages: 31

totaljim

XLDnaute Nouveau
Re : RégressionS linéaires de plusieurs ordre

Bonjour bonjour !
Bon alors tout d'abord ... problème résolu
Et maintenant quelques explications si vous me le permettez !

@Modeste Geedee
C'est bien de ce r² dont je parlais, le soucis c'est que je le récupérais bien par ma ligne de code

VB:
rdeux = Right(ActiveChart.SeriesCollection(1).Trendlines(ordre).DataLabel.Text, 6)

@Staple1600
Nan t'étais pas à coté de la plaque mais comme au dessus, le problème ne venait pas de là, pas de ce que j'avais codé.


Quelqu'un sur un autre forum m'a trouvé une solution :

Une simple petite boucle semble suffire.
Et tu peux sécuriser pour avoir un message en cas de valeur non désirée sur rdeux, pour la régler sur la vitesse de ton micro.

Remplacer (2 fois) rdeux=... par :
VB:
 For ci = 1 To 2
            DoEvents
        Next ci
                        rdeux = Right(ActiveChart.SeriesCollection(1).Trendlines(ordre).DataLabel.Text, 6)
        If IsError(rdeux) Then cj = cj + 1: Debug.Print "cj= " & cj
        If rdeux = "" Then ck = ck + 1: Debug.Print "ck= " & ck

Si j'ai bien saisi, c'est un problème de vitesse d'exécution, et avec le code ci dessus,
Elles prennent un peu de temps en donnant la main à windows pour qu'il effectue les autres tâches en attente, c'est tout, c'est à la place d'une tempo.
Ca laisse le temps à tes opérations précédentes de se finir pour récupérer le résultat.
eric

Voila macro terminée,
Merci a tout ceux qui m'ont aidé ou on voulu le faire

A bientot pour de nouvelles question j'espère
Cordialement,
TotalJim
 

Discussions similaires

Statistiques des forums

Discussions
314 491
Messages
2 110 165
Membres
110 688
dernier inscrit
hufav