| Die Lineare Regression ist ein Verfahren zur Berechnung der 'Ausgleichsgeraden'. Das ist eine Gerade, die so angelegt wird, dass sie möglichst nahe an allen gegebenen (mehr oder weniger verstreuten) Daten-Punkten liegt. | Man nutzt das Verfahren u.a., um Lineare Funktionen anschaulich darzustellen (Y abhängig von X), sowie um Prognose-Werte zu berechnen. |
Algorithmen
|
Ausgewählte IT-Rezepte |
| Live Demo | Ausgleichs-Gerade durch Datenpunkte |
| Abstands-Quadrate | Methode von C.F. Gauss |
| Algorithmus | Berechnung einer Ausgleichs-Geraden (Lineare Regression) |
| Sonderfälle | Horizontale oder vertikale Ausgleichs-Gerade |
|
Interpolieren Extrapolieren |
Berechnung neuer (unbekannter) Datenpunkte |
| Anwendung in Programmen & Programmiersprachen | |
OpenOffice-Calc, MS-Excel, ... |
|
Anwendung in Webseiten (z.B. dieser) |
|
Anwendung in Webserver-Programmen |
|
Anwendung für Kalkulations-Programme |
|
Lineare Regression mit VBA |
|
|
Da alle Kalkulations-Programme die Funktionen
↑ STEIGUNG, ACHSENABSCHNITT,
TREND anbieten, besteht normalerweise kein Bedarf nach VBA-Funktionen
zum gleichen Zweck. Das ist nur dann sinnvoll, wenn die Funktionen innerhalb von VBA verwendet werden sollen. Das Beispiel zeigt eine Version, die zu Demo-Zwecken sowohl als Excel-'Benutzerdefinierte Funktion', als auch innerhalb von VBA verwendet werden kann. |
●
Jede Gerade (auch die Ausgleichsgerade) benötigt 2 Werte zu ihrer
Beschreibung. ● Da VBA-Funktionen nur einen Wert an Excel zurückgeben können, werden die beiden Hilfs-Funktionen vba_linreg_k, vba_linreg_d als Excel-'Benutzerdefinierte (Hilfs)-Funktionen' verwendet. ● Das Programm vba_calc_linreg führt die eigentliche Berechnung durch und kann sowohl von anderen VBA-Programmen als auch von Excel (mit den genannten Hilfs-Funktionen) verwendet werden. |
Excel-InterfaceDie rechts vorgestellten Funktionen dienen als Excel-Interface, d.h. zur Übergabe der bekannten Datenpaare von Excel an VBA und zur Übergabe der Ergebnisse (k und d der Ausgleichsgeraden) an Excel.Man kann alle rechts angeführten Programme weglassen, wenn die lineare Regression nur innerhalb von VBA verwendet wird. • Die Namen aller von außen (Excel) sichtbaren Variablen und Programme erhalten zur eindeutigen Unterscheidung das Prefix vba_linreg ► Die Funktionen vba_linreg_k, vba_linreg_d können als Excel Funktionen verwendet werden. Sie verwenden die gleichen Argumente (Y-Bereich, X-Bereich) wie die entsprechenden Standard-Funktionen STEIGUNG, ACHSENABSCHNITT und sollten auch die gleichen Ergebnisse liefern. Beide Funktionen verwenden die interne (private) Funktion vba_xy_data zur Übergabe der Datenpaare und ↓ vba_calc_linreg zur Berechnung der Ausgleichsgeraden. ► Das private Programm vba_xy_data speichert die aus Excel übergebenen Datenpaare in den globalen Arrays xa,ya |
Function vba_linreg_k(range_y As Range, range_x As Range) As Double
Call vba_xy_data(range_x, range_y)
End FunctionCall vba_calc_linreg vba_linreg_k = linreg_k Function vba_linreg_d(range_y As Range, range_x As Range) As Double
Call vba_xy_data(range_x, range_y)
End FunctionCall vba_calc_linreg vba_linreg_d = linreg_d Private Sub vba_xy_data(xr As Range, yr As Range) Dim i As Integer
linreg_n = xr.Count
End SubIf yr.Count < linreg_n Then linreg_n = yr.Count ReDim linreg_xa(linreg_n) ReDim linreg_ya(linreg_n) For i = 1 To linreg_n
linreg_xa(i) = xr(i).Value
Next
linreg_ya(i) = yr(i).Value |
|
Der rechts vorgestellte Code genügt für die VBA-interne Anwendung. ► Alle Daten sind in globalen Variablen und Arrays organisiert, z.B. die bekannten DatenPaare (xa,ya), die Ausgleichsgerade (k,d) und die Mittelwerte (xm,ym) Vor der VBA-internen Anwendung müssen die bekannten Datenpaare in die Arrays xa,ya eingetragen werden. ► Das private Programm vba_calc_linreg führt die Berechnung der Ausgleichsgeraden durch. Die Ergebnisse (Mittelwerte, k,d) werden in die globalen Variablen eingetragen und daher nicht zurückgegeben. ► Für reine VBA-interne Anwendung kann man alternativ ein Array zur Rückgabe verwenden. Diese Version ist jedoch nicht Excel-kompatibel. Fortgeschrittene AnwenderInnen können das Beispiel so modifizieren, dass man keine globalen Variablen benötigt. ● Ein Vorteil der VBA-Anwendung ist, dass man die Ausgleichsgerade nur 1mal berechnen muss, nicht wie für Excel 2mal (getrennt für k und d). |
Dim linreg_n As Integer
Dim linreg_xa(), linreg_ya() As Double Dim linreg_k, linreg_d, linreg_xm, linreg_ym As Double Private Sub vba_calc_linreg() Dim i As Integer Dim sx, sy, sxy, sxx As Double
sx = 0
End Sub
sy = 0 sxy = 0 sxx = 0 For i = 1 To linreg_n
sx = sx + linreg_xa(i)
Next isy = sy + linreg_ya(i) sxy = sxy + linreg_xa(i) * linreg_ya(i) sxx = sxx + linreg_xa(i) * linreg_xa(i) linreg_xm = sx / linreg_n linreg_ym = sy / linreg_n linreg_k = (sxy - linreg_n * linreg_xm * linreg_ym) / (sxx - linreg_n * linreg_xm * linreg_xm) linreg_d = linreg_ym - linreg_k * linreg_xm |