Có một phép biến đổi giống như Box-Cox cho các biến độc lập không? Đó là, một phép biến đổi tối ưu hóa biến sao cho sẽ phù hợp hơn cho mô hình tuyến tính?y~f(x)
Nếu vậy, có một chức năng để thực hiện điều này với R
?
Có một phép biến đổi giống như Box-Cox cho các biến độc lập không? Đó là, một phép biến đổi tối ưu hóa biến sao cho sẽ phù hợp hơn cho mô hình tuyến tính?y~f(x)
Nếu vậy, có một chức năng để thực hiện điều này với R
?
Câu trả lời:
John Tukey đã ủng hộ " phương pháp ba điểm " của mình để tìm ra biểu thức lại của các biến để tuyến tính hóa các mối quan hệ.
Tôi sẽ minh họa bằng một bài tập từ cuốn sách của ông, Phân tích dữ liệu khám phá . Đây là dữ liệu áp suất hơi thủy ngân từ một thí nghiệm trong đó nhiệt độ thay đổi và đo áp suất hơi.
pressure <- c(0.0004, 0.0013, 0.006, 0.03, 0.09, 0.28, 0.8, 1.85, 4.4,
9.2, 18.3, 33.7, 59, 98, 156, 246, 371, 548, 790) # mm Hg
temperature <- seq(0, 360, 20) # Degrees C
Mối quan hệ là phi tuyến mạnh mẽ: xem bảng bên trái trong hình minh họa.
Bởi vì đây là một bài tập khám phá , chúng tôi hy vọng nó sẽ tương tác. Nhà phân tích được yêu cầu bắt đầu bằng cách xác định ba điểm "điển hình" trong cốt truyện : một điểm gần mỗi đầu và một điểm ở giữa. Tôi đã làm như vậy ở đây và đánh dấu chúng bằng màu đỏ. (Khi tôi lần đầu tiên thực hiện bài tập này từ lâu, tôi đã sử dụng một tập hợp các điểm khác nhau nhưng đạt được kết quả tương tự.)
Trong phương pháp ba điểm, một tìm kiếm - bằng cách mạnh mẽ hoặc bằng cách khác - cho phép chuyển đổi Box-Cox khi áp dụng cho một trong các tọa độ - hoặc y hoặc x - sẽ (a) đặt các điểm điển hình xấp xỉ trên a dòng và (b) sử dụng một sức mạnh "tốt đẹp", thường được chọn từ một "nấc thang" sức mạnh mà nhà phân tích có thể hiểu được.
Vì những lý do sẽ trở nên rõ ràng sau này, tôi đã mở rộng họ Box-Cox bằng cách cho phép "bù" để các phép biến đổi ở dạng
Đây là một R
thực hiện nhanh chóng và bẩn . Đầu tiên, nó tìm thấy một giải pháp tối ưu , sau đó làm tròn λ đến giá trị gần nhất trên thang và, theo hạn chế đó, tối ưu hóa α (trong giới hạn hợp lý). Nó cực kỳ nhanh chóng vì tất cả các tính toán chỉ dựa trên ba điểm tiêu biểu trong bộ dữ liệu ban đầu. (Bạn có thể làm chúng bằng bút chì và giấy, thậm chí, đó chính xác là những gì Tukey đã làm.)
box.cox <- function(x, parms=c(1,0)) {
lambda <- parms[1]
offset <- parms[2]
if (lambda==0) log(x+offset) else ((x+offset)^lambda - 1)/lambda
}
threepoint <- function(x, y, ladder=c(1, 1/2, 1/3, 0, -1/2, -1)) {
# x and y are length-three samples from a dataset.
dx <- diff(x)
f <- function(parms) (diff(diff(box.cox(y, parms)) / dx))^2
fit <- nlm(f, c(1,0))
parms <- fit$estimate #$
lambda <- ladder[which.min(abs(parms[1] - ladder))]
if (lambda==0) offset = 0 else {
do <- diff(range(y))
offset <- optimize(function(x) f(c(lambda, x)),
c(max(-min(x), parms[2]-do), parms[2]+do))$minimum
}
c(lambda, offset)
}
Khi phương pháp ba điểm được áp dụng cho các giá trị áp suất (y) trong bộ dữ liệu hơi thủy ngân, chúng tôi thu được bảng giữa của các ô.
data <- cbind(temperature, pressure)
n <- dim(data)[1]
i3 <- c(2, floor((n+1)/2), n-1)
parms <- threepoint(temperature[i3], pressure[i3])
y <- box.cox(pressure, parms)
parms
Chúng tôi đã đạt đến một điểm tương tự với bối cảnh của câu hỏi: vì bất kỳ lý do gì (thường là để ổn định phương sai dư), chúng tôi đã biểu thị lại biến phụ thuộc , nhưng chúng tôi thấy rằng mối quan hệ với một biến độc lập là phi tuyến. Vì vậy, bây giờ chúng ta chuyển sang thể hiện lại biến độc lập trong nỗ lực tuyến tính hóa mối quan hệ. Điều này được thực hiện theo cùng một cách, chỉ đơn thuần là đảo ngược vai trò của x và y:
parms <- threepoint(y[i3], temperature[i3])
x <- box.cox(temperature, parms)
parms
Hãy xem các slide này về "Chẩn đoán hồi quy" của John Fox (có sẵn từ đây , hoàn chỉnh với các tài liệu tham khảo), trong đó thảo luận ngắn gọn về vấn đề chuyển đổi phi tuyến. Nó bao gồm "quy tắc phình to" của Tukey để chọn các phép biến đổi sức mạnh (được giải quyết bằng câu trả lời được chấp nhận), nhưng cũng đề cập đến các biến đổi của Box-Cox và Yeo-Johnson. Xem Phần 3.6 của các slide. Đối với một tác phẩm chính thức hơn của cùng một tác giả, xem J. Fox, Phân tích hồi quy ứng dụng và mô hình tuyến tính tổng quát, Ấn bản thứ hai (Sage, 2008) .
Đối với các gói R thực tế giúp với điều này, hoàn toàn hãy xem gói xe , được tác giả bởi J. Fox và S. Weisberg. Gói này đi kèm với J. Fox và S. Weisberg, Một đồng hành R với hồi quy ứng dụng, Ấn bản thứ hai, (Sage, 2011) , một thứ khác phải đọc. Sử dụng gói đó, bạn có thể bắt đầu từ basicPower()
(biến đổi năng lượng đơn giản), bcPower()
(biến đổi Box-Cox) và yjPower()
(biến đổi Yeo-Johnson). Ngoài ra còn có powerTransform () :
Hàm powerTransform được sử dụng để ước tính các phép biến đổi chuẩn hóa của một biến ngẫu nhiên đơn biến hoặc đa biến.
Kiểm tra cả hai cuốn sách để biết thêm chi tiết về lý thuyết đằng sau những biến đổi này và về phương pháp tính toán.
R
và, nghĩ về nó một lúc, tôi không chắc chính xác người ta sẽ làm điều này như thế nào . Tiêu chí nào bạn sẽ tối ưu hóa để đảm bảo chuyển đổi "tuyến tính nhất"? rất hấp dẫn, nhưng như đã thấy trong câu trả lời của tôi ở đây , không thể sử dụng R 2 một mình để xem liệu giả định tuyến tính của một mô hình có được thỏa mãn hay không. Bạn đã có một số tiêu chí trong tâm trí?