York (2004) ha abordado la optimización de máxima probabilidad para el caso de incertidumbres en x e y. Aquí está el código R para su función.
"YorkFit", escrito por Rick Wehr, 2011, traducido a R por Rachel Chang
Rutina universal para encontrar el mejor ajuste en línea recta a los datos con errores correlacionados y variables, incluyendo errores y estimaciones de bondad de ajuste, siguiendo la ecuación (13) de York 2004, American Journal of Physics, que se basó a su vez en York 1969, Earth and Planetary Sciences Letters
YorkFit <- función (X, Y, Xstd, Ystd, Ri = 0, b0 = 0, printCoefs = 0, makeLine = 0, eps = 1e-7)
X, Y, Xstd, Ystd: ondas que contienen puntos X, puntos Y y sus desviaciones estándar
ADVERTENCIA: Xstd e Ystd no pueden ser cero ya que esto hará que Xw o Yw sean NaN. Use un valor muy pequeño en su lugar.
Ri: coeficientes de correlación para errores X e Y - longitud 1 o longitud de X e Y
b0: aproximación inicial aproximada para la pendiente (se puede obtener de un ajuste estándar de mínimos cuadrados sin errores)
printCoefs: establecido igual a 1 para mostrar resultados en la ventana de comandos
makeLine: establece igual a 1 para generar una onda Y para la línea de ajuste
Devuelve una matriz con la intersección y la pendiente más sus incertidumbres
Si no se proporciona una suposición inicial para b0, simplemente use OLS if (b0 == 0) {b0 = lm (Y ~ X) $ coeficientes [2]}
tol = abs(b0)*eps #the fit will stop iterating when the slope converges to within this value
a, b: intersección final y pendiente a.err, b.err: incertidumbres estimadas en intersección y pendiente
# 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
ajusta a un modelo de regresión lineal, es decir: un modelo de la expectativa de con respecto a , en el que claramente es tan aleatorio y se considera conocido. Para lidiar con la incertidumbre en , necesitará un modelo diferente. P ( Y | X ) Y X X