Hồi quy khi mỗi điểm có độ không đảm bảo riêng trong cả


12

Tôi thực hiện đo của hai biến xy . Cả hai đều có sự không chắc chắn đã biết σ xσ y liên quan đến chúng. Tôi muốn tìm mối quan hệ giữa xy . Tôi làm nó như thế nào?nxyσxσyxy

EDIT : mỗi có khác nhau σ x , i liên kết với nó, và cùng với các y i .xiσx,iyi


Ví dụ R sinh sản:

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

linear regression without considering errors in variables

Vấn đề với ví dụ này là tôi nghĩ rằng nó giả định rằng không có sự không chắc chắn trong . Làm thế nào tôi có thể sửa lỗi này?x


Đúng, lmphù hợp với mô hình hồi quy tuyến tính, đó là: mô hình kỳ vọng của đối với P ( Y | X ) , trong đó rõ ràng Y là ngẫu nhiên và X được coi là đã biết. Để đối phó với sự không chắc chắn trong X, bạn sẽ cần một mô hình khác. YP(Y|X)YXX
liên hợp chiến

1
Đối với trường hợp khá đặc biệt của bạn (đơn biến với tỷ lệ độ ồn đã biết đối với X và Y) Hồi quy Deming sẽ thực hiện thủ thuật, ví dụ: Deminghàm trong gói R MethComp .
liên hợp chiến

1
@conjugatep Warrior Cảm ơn, điều này có vẻ đầy hứa hẹn. Tôi đang tự hỏi: liệu hồi quy Deming có còn hoạt động không nếu tôi có một phương sai khác nhau (nhưng vẫn được biết) trên mỗi cá nhân x và y? tức là nếu x là độ dài và tôi đã sử dụng thước kẻ với các giới hạn khác nhau để thu được mỗi x
rhombidodecahedron 15/03/2016

Tôi nghĩ có lẽ cách để giải quyết nó khi có các phương sai khác nhau cho mỗi phép đo là sử dụng phương pháp của York. Có ai tình cờ biết nếu có R thực hiện phương pháp này không?
rhombidodecahedron 15/03/2016

1
@rhombidodecahedron Xem phần "có lỗi đo lường" phù hợp với câu trả lời của tôi ở đó: stats.stackexchange.com/questions/174533/ (được lấy từ tài liệu về việc hủy gói).
Roland

Câu trả lời:


9

Lθγ

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

(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

Nhân vật

Các dòng thực sự được hiển thị trong màu xanh chấm. Dọc theo đó, các điểm ban đầu được vẽ dưới dạng các vòng tròn rỗng. Mũi tên màu xám kết nối chúng với các điểm quan sát, được vẽ dưới dạng các đĩa đen đặc. Các giải pháp được vẽ như là một đường màu đỏ rắn. Mặc dù có sự sai lệch lớn giữa các giá trị quan sát và thực tế, giải pháp này rất gần với đường chính xác trong khu vực này.

#
# 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. Theo như tôi hiểu, câu trả lời này cũng cũ hơn Q: stats.stackexchange.com/questions/178727 ? Chúng ta nên đóng nó như một bản sao sau đó.
amip nói rằng Phục hồi lại

Ngoài ra, theo nhận xét của tôi cho câu trả lời trong luồng đó, có vẻ như deminghàm cũng có thể xử lý các lỗi biến. Nó có thể sẽ mang lại một sự phù hợp rất giống với bạn.
amip nói rằng Phục hồi lại

Tôi tự hỏi nếu dòng thảo luận có ý nghĩa hơn nếu bạn chuyển đổi vị trí của 2 đoạn trên & dưới hình?
gung - Phục hồi Monica

3
Tôi đã được nhắc nhở sáng nay (bởi một cử tri) rằng câu hỏi này đã được hỏi và trả lời theo nhiều cách, với mã làm việc, vài năm trước trên trang web Mathicala SE .
whuber

Liệu giải pháp này có một tên? và có thể là một tài nguyên để đọc thêm (ngoài ý nghĩa của trang Mathicala SE)?
JustGettin Bắt đầu

0

Tối ưu hóa khả năng tối đa cho trường hợp không chắc chắn trong x và y đã được York (2004) đề cập. Đây là mã R cho chức năng của mình.

"YorkFit", được viết bởi Rick Wehr, 2011, được dịch sang R bởi Rachel Chang

Quy trình phổ biến để tìm đường thẳng phù hợp nhất với dữ liệu có các lỗi tương quan, có thể thay đổi, bao gồm lỗi và mức độ tốt của ước tính phù hợp, theo phương trình. (13) của York 2004, Tạp chí Vật lý Hoa Kỳ, dựa trên York 1969, Thư Khoa học Trái đất và Hành tinh

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

X, Y, Xstd, Ystd: sóng chứa điểm X, điểm Y và độ lệch chuẩn của chúng

CẢNH BÁO: Xstd và Ystd không thể bằng 0 vì điều này sẽ khiến Xw hoặc Yw là NaN. Sử dụng một giá trị rất nhỏ thay thế.

Ri: hệ số tương quan cho các lỗi X và Y - chiều dài 1 hoặc chiều dài của X và Y

b0: dự đoán ban đầu về độ dốc (có thể nhận được từ một hình vuông nhỏ nhất phù hợp mà không có lỗi)

printCoefs: đặt bằng 1 để hiển thị kết quả trong cửa sổ lệnh

makeLine: đặt bằng 1 để tạo sóng Y cho đường phù hợp

Trả về một ma trận với phần chặn và độ dốc cộng với độ không đảm bảo của chúng

Nếu không có dự đoán ban đầu cho b0, thì chỉ cần sử dụng OLS if (b0 == 0) {b0 = lm (Y ~ X) $ hệ số [2]}

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

a, b: đánh chặn cuối cùng và độ dốc a.err, b.err: độ không đảm bảo ước tính trong đánh chặn và độ dốc

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

Cũng lưu ý, gói R "IsoplotR" bao gồm hàm york (), cho kết quả giống như mã YorkFit ở đây.
Steven Wofsy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.