Die Optimierung der maximalen Wahrscheinlichkeit für den Fall von Unsicherheiten in x und y wurde von York (2004) angesprochen. Hier ist R-Code für seine Funktion.
"YorkFit", geschrieben von Rick Wehr, 2011, übersetzt in R von Rachel Chang
Universelle Routine zum Ermitteln der besten geraden Anpassung an Daten mit variablen, korrelierten Fehlern, einschließlich Fehler- und Anpassungsgüte-Schätzungen, nach Gl. (13) von York 2004, American Journal of Physics, das sich wiederum auf York 1969, Earth and Planetary Sciences Letters, stützte
YorkFit <- Funktion (X, Y, Xstd, Ystd, Ri = 0, b0 = 0, printCoefs = 0, makeLine = 0, eps = 1e-7)
X, Y, Xstd, Ystd: Wellen mit X-Punkten, Y-Punkten und deren Standardabweichungen
WARNUNG: Xstd und Ystd dürfen nicht Null sein, da dies dazu führt, dass Xw oder Yw NaN sind. Verwenden Sie stattdessen einen sehr kleinen Wert.
Ri: Korrelationskoeffizienten für X- und Y-Fehler - Länge 1 oder Länge von X und Y
b0: grobe anfängliche Schätzung für die Steigung (kann aus einer fehlerfreien Standardanpassung der kleinsten Quadrate erhalten werden)
printCoefs: Setzen Sie den Wert auf 1, um die Ergebnisse im Befehlsfenster anzuzeigen
makeLine: Gleich 1 setzen, um eine Y-Welle für die Anpassungslinie zu erzeugen
Gibt eine Matrix mit dem Achsenabschnitt und der Steigung sowie deren Unsicherheiten zurück
Wenn keine anfängliche Schätzung für b0 gegeben ist, dann verwende einfach OLS, wenn (b0 == 0) {b0 = 1m (Y ~ X) $ Koeffizienten [2]}
tol = abs(b0)*eps #the fit will stop iterating when the slope converges to within this value
a, b: Endschnitt und Steigung a.err, b.err: geschätzte Unsicherheiten in Schnitt und Steigung
# WAVE DEFINITIONS #
Xw = 1/(Xstd^2) #X weights
Yw = 1/(Ystd^2) #Y weights
# ITERATIVE CALCULATION OF SLOPE AND INTERCEPT #
b = b0
b.diff = tol + 1
while(b.diff>tol)
{
b.old = b
alpha.i = sqrt(Xw*Yw)
Wi = (Xw*Yw)/((b^2)*Yw + Xw - 2*b*Ri*alpha.i)
WiX = Wi*X
WiY = Wi*Y
sumWiX = sum(WiX, na.rm = TRUE)
sumWiY = sum(WiY, na.rm = TRUE)
sumWi = sum(Wi, na.rm = TRUE)
Xbar = sumWiX/sumWi
Ybar = sumWiY/sumWi
Ui = X - Xbar
Vi = Y - Ybar
Bi = Wi*((Ui/Yw) + (b*Vi/Xw) - (b*Ui+Vi)*Ri/alpha.i)
wTOPint = Bi*Wi*Vi
wBOTint = Bi*Wi*Ui
sumTOP = sum(wTOPint, na.rm=TRUE)
sumBOT = sum(wBOTint, na.rm=TRUE)
b = sumTOP/sumBOT
b.diff = abs(b-b.old)
}
a = Ybar - b*Xbar
wYorkFitCoefs = c(a,b)
# ERROR CALCULATION #
Xadj = Xbar + Bi
WiXadj = Wi*Xadj
sumWiXadj = sum(WiXadj, na.rm=TRUE)
Xadjbar = sumWiXadj/sumWi
Uadj = Xadj - Xadjbar
wErrorTerm = Wi*Uadj*Uadj
errorSum = sum(wErrorTerm, na.rm=TRUE)
b.err = sqrt(1/errorSum)
a.err = sqrt((1/sumWi) + (Xadjbar^2)*(b.err^2))
wYorkFitErrors = c(a.err,b.err)
# GOODNESS OF FIT CALCULATION #
lgth = length(X)
wSint = Wi*(Y - b*X - a)^2
sumSint = sum(wSint, na.rm=TRUE)
wYorkGOF = c(sumSint/(lgth-2),sqrt(2/(lgth-2))) #GOF (should equal 1 if assumptions are valid), #standard error in GOF
# OPTIONAL OUTPUTS #
if(printCoefs==1)
{
print(paste("intercept = ", a, " +/- ", a.err, sep=""))
print(paste("slope = ", b, " +/- ", b.err, sep=""))
}
if(makeLine==1)
{
wYorkFitLine = a + b*X
}
ans=rbind(c(a,a.err),c(b, b.err)); dimnames(ans)=list(c("Int","Slope"),c("Value","Sigma"))
return(ans)
}
lm
passt ein lineares Regressionsmodell, das heißt: ein Modell der Erwartung von