Her bir nokta her ikisi de kendi belirsizlik vardır Regresyon


12

ve değişkenlerinin ölçümünü yaptım . Her ikisinin de ilişkili belirsizlikleri ve olduğu bilinmektedir . ve arasındaki ilişkiyi bulmak istiyorum . Nasıl yapabilirim?x y σ x σ y x ynxyσxσyxy

DÜZENLEME : her ile ilişkili farklı bir ve ile aynı .σ x , i y ixiσx,iyi


Tekrarlanabilir R örneği:

## pick some real x and y values 
true_x <- 1:100
true_y <- 2*true_x+1

## pick the uncertainty on them
sigma_x <- runif(length(true_x), 1, 10) # 10
sigma_y <- runif(length(true_y), 1, 15) # 15

## perturb both x and y with noise 
noisy_x <- rnorm(length(true_x), true_x, sigma_x)
noisy_y <- rnorm(length(true_y), true_y, sigma_y)

## make a plot 
plot(NA, xlab="x", ylab="y",
    xlim=range(noisy_x-sigma_x, noisy_x+sigma_x), 
    ylim=range(noisy_y-sigma_y, noisy_y+sigma_y))
arrows(noisy_x, noisy_y-sigma_y, 
       noisy_x, noisy_y+sigma_y, 
       length=0, angle=90, code=3, col="darkgray")
arrows(noisy_x-sigma_x, noisy_y,
       noisy_x+sigma_x, noisy_y,
       length=0, angle=90, code=3, col="darkgray")
points(noisy_y ~ noisy_x)

## fit a line 
mdl <- lm(noisy_y ~ noisy_x)
abline(mdl)

## show confidence interval around line 
newXs <- seq(-100, 200, 1)
prd <- predict(mdl, newdata=data.frame(noisy_x=newXs), 
    interval=c('confidence'), level=0.99, type='response')
lines(newXs, prd[,2], col='black', lty=3)
lines(newXs, prd[,3], col='black', lty=3)

değişkenlerdeki hataları dikkate almadan doğrusal regresyon

Bu örnekte sorun ben hiçbir belirsizlikler var olduğunu varsayar düşünüyorum olmasıdır . Bunu nasıl düzeltebilirim?x


Doğru, lmbeklentisine bir model: bir lineer regresyon modeli, uygun ile ilgili olarak P ( Y | X ) açık bir şekilde burada, Y, rasgele olarak ve X, bilinen kabul edilir. X'deki belirsizlikle başa çıkmak için farklı bir modele ihtiyacınız olacak. YP(Y|X)YXX
eşlenik

1
Oldukça özel durumunuz için (X ve Y için bilinen bir gürültü seviyesi oranı ile tek değişkenli) Deming regresyonu hile yapacaktır, örneğin DemingR paketi MethComp'deki işlev .
konjugateprior

1
@conjugateprior Teşekkürler, bu umut verici görünüyor. Merak ediyorum: Her bir x ve y'de farklı (ama yine de bilinen) bir farklılığım varsa Deming regresyonu hala çalışıyor mu? Eğer
x'ler uzunluksa

Her ölçüm için farklı sapmalar olduğunda belki de bunu çözmenin yolu York'un yöntemini kullanmaktır. Bu yöntemin bir R uygulaması olup olmadığını bilen var mı?
rhombidodecahedron

1
@rhombidodecahedron Buradaki cevabımdaki "ölçülen hatalarla" bölümüne bakın: stats.stackexchange.com/questions/174533/… (paket deming belgelerinden alınmıştır).
Roland

Yanıtlar:


9

Lθγ

(x,y):cos(θ)x+sin(θ)y=γ.

Herhangi bir nokta arasındaki işaretli mesafe(x,y)

d(x,y;L)=cos(θ)x+sin(θ)yγ.

xiσi2yiτi2xiyi

Var(d(xi,yi;L))=cos2(θ)σi2+sin2(θ)τi2.

θγ

σiτi0


τiσixn=8

şekil

Gerçek çizgi noktalı mavi ile gösterilir. Bununla birlikte orijinal noktalar içi boş daireler olarak çizilir. Gri oklar, onları katı siyah diskler olarak çizilen gözlenen noktalara bağlar. Çözelti, düz kırmızı bir çizgi halinde çizilir. Gözlenen ve gerçek değerler arasında büyük sapmaların varlığına rağmen, çözüm bu bölgedeki doğru çizgiye oldukça yakındır.

#
# Generate data.
#
theta <- c(1, -2, 3) # The line is theta %*% c(x,y,-1) == 0
theta[-3] <- theta[-3]/sqrt(crossprod(theta[-3]))
n <- 8
set.seed(17)
sigma <- rexp(n, 1/2)
tau <- rexp(n, 1)
u <- 1:n
xy.0 <- t(outer(c(-theta[2], theta[1]), 0:(n-1)) + c(theta[3]/theta[1], 0))
xy <- xy.0 + cbind(rnorm(n, sd=sigma), rnorm(n, sd=tau))
#
# Fit a line.
#
x <- xy[, 1]
y <- xy[, 2]
f <- function(phi) { # Negative log likelihood, up to an additive constant
  a <- phi[1]
  gamma <- phi[2]
  sum((x*cos(a) + y*sin(a) - gamma)^2 / ((sigma*cos(a))^2 + (tau*sin(a))^2))/2
}
fit <- lm(y ~ x) # Yields starting estimates
slope <- coef(fit)[2]
theta.0 <- atan2(1, -slope)
gamma.0 <- coef(fit)[1] / sqrt(1 + slope^2)
sol <- nlm(f,c(theta.0, gamma.0))
#
# Plot the data and the fit.
#
theta.hat <- sol$estimate[1] %% (2*pi)
gamma.hat <- sol$estimate[2]
plot(rbind(xy.0, xy), type="n", xlab="x", ylab="y")
invisible(sapply(1:n, function(i) 
  arrows(xy.0[i,1], xy.0[i,2], xy[i,1], xy[i,2], 
         length=0.15, angle=20, col="Gray")))
points(xy.0)
points(xy, pch=16)
abline(c(theta[3] / theta[2], -theta[1]/theta[2]), col="Blue", lwd=2, lty=3)
abline(c(gamma.hat / sin(theta.hat), -1/tan(theta.hat)), col="Red", lwd=2)

+1. Anladığım kadarıyla, bu daha eski Q'ya da cevap veriyor: stats.stackexchange.com/questions/178727 ? Bunu bir kopya olarak kapatmalıyız.
amip, Reinstate Monica

Ayrıca, bu iş parçacığındaki cevabımın yorumuna göre, demingişlev de değişken hataları işleyebilir gibi görünüyor . Muhtemelen sizinkine çok benzer bir uyum sağlamalıdır.
amip diyor Reinstate Monica

Şeklin üstündeki ve altındaki 2 paragrafın yerlerini değiştirirseniz, tartışma akışının daha anlamlı olup olmadığını merak ediyorum.
gung - Monica'yı eski

3
Bu sabah (bir seçmen tarafından) bu sorunun birkaç yıl önce Mathematica SE sitesinde çalışma kodu ile sorulduğunu ve cevaplandığını hatırlattı .
whuber

Bu çözümün bir adı var mı? ve muhtemelen daha fazla okumak için bir kaynak (yani Mathematica SE sitesi yanında)?
JustGettinStarted

0

X ve y'deki belirsizlikler için maksimum olasılık optimizasyonu York (2004) tarafından ele alınmıştır. İşte işlevi için R kodu.

Rick Wehr tarafından yazılan "YorkFit", 2011, Rachel Chang tarafından R'ye çevrildi

Eq. (13), York 2004, sırayla York 1969, Yer ve Gezegen Bilimleri Mektuplarına dayanan Amerikan Fizik Dergisi

YorkFit <- işlevi (X, Y, Xstd, Ystd, Ri = 0, b0 = 0, printCoefs = 0, makeLine = 0, eps = 1e-7)

X, Y, Xstd, Ystd: X noktaları, Y noktaları ve standart sapmalarını içeren dalgalar

UYARI: Xstd ve Ystd sıfır olamaz, çünkü bu Xw veya Yw'nin NaN olmasına neden olur. Bunun yerine çok küçük bir değer kullanın.

Ri: X ve Y hataları için korelasyon katsayıları - uzunluk 1 veya X ve Y uzunluğu

b0: eğim için kaba ilk tahmin (hatasız standart en küçük karelerden sığdırılarak elde edilebilir)

printCoefs: sonuçları komut penceresinde görüntülemek için 1'e eşit olarak ayarlayın

makeLine: fit çizgisi için bir Y dalgası oluşturmak için 1'e eşit olarak ayarlayın

Kesişim ve eğim artı belirsizliklerini içeren bir matris döndürür

B0 için ilk tahmin yapılmazsa, (b0 == 0) {b0 = lm (Y ~ X) $ katsayıları [2]} ise OLS kullanın.

tol = abs(b0)*eps #the fit will stop iterating when the slope converges to within this value

a, b: son kesişim ve eğim a.err, b.err: kesişim ve eğimdeki tahmini belirsizlikler

# 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)
 }

Ayrıca, R paketi "IsoplotR", YorkFit koduyla aynı sonuçları veren york () işlevini içerir.
Steven Wofsy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.