Beispiel: Lineare Regression mit Mathematica

Daten aus einem csv-File einlesen

data=Import["/Users/ihn/Documents/Teaching/VP-Leitung/DataAnalysis/2013NewProgram/Lectures given in 2013/6. Lecture/daten.csv"];

Daten in Tabellenform darstellen

In der einfachsten Form lassen sich die Daten mit dem Grid-Befehl darstellen.

Grid[data]

Dabei gibt es viele Optionen (siehe Mathematica Hilfe), welche die Darstellung übersichtlicher machen können:

Grid[Prepend[data,{Style["x",Bold],Style["y",Bold]}],Background->{None,{Gray,{LightGray,White}}},Dividers->{Black,{Black,Black}},Frame->True]

Mit Datenlisten arbeiten

Länge der Datenliste (Zahl der Datenpunkte) ermitteln:

n=Length[data]

Auf einzelne Elemente (Datenpunkte) der Datenliste zugreifen:

data[[3]]

Auf Bereiche in der Datenliste zugreifen:

data[[Range[2,4]]]

Nur die x-Werte der Datenpunkte 2 bis 4:

data[[Range[2,4],1]]

Nur die y-Werte der Datenpunkte 2 bis 4:

data[[Range[2,4],2]]

Datenliste graphisch darstellen

g1=ListPlot[data,PlotRange->{{0,9},{0,25}},PlotMarkers->Automatic,LabelStyle->24,AxesLabel->{"x","y"}]

Statistik der Datenliste

Mittelwert der x-Werte:

Meanx=Mean[data[[Range[1,n],1]]]

Mittelwert der y-Werte:

Meany=Mean[data[[Range[1,n],2]]]

Varianz der x-Werte:

Varx=CentralMoment[data[[Range[1,n],1]],2]

Varianz der y - Werte :

Vary=CentralMoment[data[[Range[1,n],2]],2]

Empirischer Korrelationskoeffizient:

ρ=((CentralMoment[data,{1,1}])/(Sqrt[Varx Vary]))

Lineare Regression, Variante I: Schätzwerte und ihre Unsicherheiten (gemäss Vorlesung)

(Subscript[A, 0])=(Sqrt[(Vary/Varx)])ρ

(Subscript[B, 0])=Meany

(Subscript[C, 0])=Vary(1-(ρ^2))

(Subscript[σ, A])=(Sqrt[((Subscript[C, 0])/(Varx (n-2)))])

(Subscript[σ, B])=(Sqrt[((Subscript[C, 0])/((n-2)))])

Fitkurve graphisch darstellen

g2=Plot[(Subscript[A, 0])(x-Meanx)+(Subscript[B, 0]),{x,0,8},PlotStyle->Red,AxesLabel->{"x","y"},LabelStyle->24]

Daten mit Fitkurve graphisch darstellen

Show[g1,g2]

Variablen löschen

n=.;

Lineare Regression, Variante II: mit LinearModelFit-Funktion

Mit dem folgenden “high-level” Befehl kann man eine lineare Regressionsgerade an Daten fitten:

model=LinearModelFit[data,x,x]

Fitkurve extrahieren:

model["BestFit"]

Fitkurve darstellen:

Show[ListPlot[data,PlotMarkers->Automatic], Plot[model["BestFit"], {x, 0, 9},PlotStyle->Red],PlotRange->{{0,9},{0,25}},AxesOrigin->{0,0},AxesLabel->{"x","y"},LabelStyle->24]

Die Fitparameter und ihre Fehler lassen sich so extrahieren :

model["ParameterTable"]

Aber Vorsicht: der Fit mit der Funktion f(x) = a x + b führt zu korrelierten Parametern a und b. Die Angabe des “Standard Error” reicht daher nicht aus, vielmehr muss eine Korrelationsmatrix angegeben werden. Dieses Problem entsteht nicht beim Fitten mit f(x) = A (x - (OverBar[x])) + B, da in diesem Fall die Parameter A und B unkorreliert sind!

Hier wäre ein Weg drumherum : wir verschieben die Daten “von Hand” um den Mittelwert von x.

datashifted=Table[{data[[j,1]]-Meanx,data[[j,2]]},{j,1,n}]

model=LinearModelFit[datashifted,x,x]

Jetzt stimmen die Fitparameter mit unseren Ergebnissen oben überein, und auch der “Standard Error” gibt unsere Ergebnisse von oben genau wieder.

model["ParameterTable"]

Fazit: benutze keine Fitroutinen irgendeiner Software, von der Du nicht genau weisst, was sie macht und die Du nicht an einfachsten Beispielen getestet hast! Die Zahl unkritischer Anwender von Statistiksoftware ist bereits gross genug, die Zahl der grob falschen Ergebnisse ist unermesslich.