Tôi có một âm mưu phân tán. Làm cách nào để thêm đường xu hướng phi tuyến tính?
Tôi có một âm mưu phân tán. Làm cách nào để thêm đường xu hướng phi tuyến tính?
Câu trả lời:
Hãy tạo một số dữ liệu.
n <- 100 x <- seq (n) y <- rnorm (n, 50 + 30 * x ^ (- 0,2), 1) Dữ liệu <- data.frame (x, y)
Sau đây cho thấy làm thế nào bạn có thể phù hợp với một dòng hoàng thổ hoặc phù hợp với hồi quy phi tuyến tính.
cốt truyện (y ~ x, Dữ liệu) # phù hợp với một dòng hoàng thổ loess_fit <- hoàng thổ (y ~ x, Dữ liệu) dòng (Dữ liệu $ x, dự đoán (loess_fit), col = "blue") # phù hợp với hồi quy phi tuyến tính nls_fit <- nls (y ~ a + b * x ^ (- c), Dữ liệu, start = list (a = 80, b = 20, c = 0,2)) dòng (Dữ liệu $ x, dự đoán (nls_fit), col = "đỏ")
Nếu bạn sử dụng ggplot2
(hệ thống vẽ thứ ba, trong R, sau cơ sở R và mạng), điều này trở thành:
library(ggplot2)
ggplot(Data, aes(x,y)) + geom_point() + geom_smooth()
Bạn có thể chọn cách làm mịn dữ liệu: xem ?stat_smooth
chi tiết và ví dụ.
stat_smooth
bằng cách nhập ?stat_smooth
như Vincent đã nêu. :-)
Không biết chính xác những gì bạn đang tìm kiếm, sử dụng lattice
gói bạn có thể dễ dàng thêm một đường cong hoàng thổ với type="smooth"
; ví dụ,
> library(lattice)
> x <- rnorm(100)
> y <- rnorm(100)
> xyplot(y ~ x, type=c("smooth", "p"))
Xem help("panel.loess")
các đối số có thể được chuyển cho thói quen phù hợp hoàng thổ để thay đổi, ví dụ, mức độ của đa thức sử dụng.
Cập nhật
Để thay đổi màu của đường cong hoàng thổ, bạn có thể viết một hàm nhỏ và chuyển nó dưới dạng panel
tham số tới xyplot
:
x <- rnorm(100)
y <- rnorm(100)
panel_fn <- function(x, y, ...)
{
panel.xyplot(x, y, ...)
panel.xyplot(x, y, type="smooth", col="red", ...)
}
xyplot(y ~ x, panel=panel_fn)
Câu hỏi của bạn hơi mơ hồ, vì vậy tôi sẽ đưa ra một số giả định về vấn đề của bạn là gì. Nó sẽ giúp ích rất nhiều nếu bạn có thể đưa ra một biểu đồ phân tán và mô tả dữ liệu một chút. Xin vui lòng, nếu tôi đang đưa ra các giả định xấu thì bỏ qua câu trả lời của tôi.
Đầu tiên, có thể dữ liệu của bạn mô tả một số quy trình mà bạn tin tưởng hợp lý là phi tuyến tính. Chẳng hạn, nếu bạn đang cố gắng thực hiện hồi quy về khoảng cách để xe dừng lại với phanh đột ngột so với tốc độ của xe, thì vật lý cho chúng ta biết rằng năng lượng của xe tỷ lệ với bình phương vận tốc - không phải là vận tốc chinh no. Vì vậy, bạn có thể muốn thử hồi quy đa thức trong trường hợp này và (trong R) bạn có thể làm một cái gì đó như thế model <- lm(d ~ poly(v,2),data=dataset)
. Có rất nhiều tài liệu về cách đưa các phi tuyến tính khác nhau vào mô hình hồi quy.
Mặt khác, nếu bạn có một dòng "chao đảo" và bạn không biết tại sao nó lại chao đảo, thì điểm khởi đầu tốt có thể là hồi quy có trọng số cục bộ hoặc loess
trong R. Điều này thực hiện hồi quy tuyến tính trên một mức nhỏ khu vực, trái ngược với toàn bộ dữ liệu. Dễ dàng nhất để tưởng tượng một phiên bản "k lân cận gần nhất", trong đó để tính giá trị của đường cong tại bất kỳ điểm nào, bạn tìm thấy các điểm k gần điểm quan tâm nhất và tính trung bình của chúng. Loess chỉ như vậy nhưng sử dụng hồi quy thay vì trung bình thẳng. Đối với điều này, sử dụng model <- loess(y ~ x, data=dataset, span=...)
, trong đó các span
biến kiểm soát mức độ làm mịn.
Trên bàn tay thứ ba (hết tay) - bạn đang nói về xu hướng? Đây có phải là một vấn đề thời gian? Nếu có, hãy thận trọng một chút với việc diễn giải các đường xu hướng và ý nghĩa thống kê. Xu hướng trong chuỗi thời gian có thể xuất hiện trong các quy trình "tự phát" và đối với các quy trình này, tính ngẫu nhiên của quy trình đôi khi có thể tạo ra các xu hướng do nhiễu ngẫu nhiên và kiểm tra ý nghĩa thống kê sai có thể cho bạn biết điều đó có ý nghĩa khi không!
Đặt các điểm mẫu biểu đồ phân tán và đường cong trơn tru trên cùng một biểu đồ:
library(graphics)
## Create some x,y sample points falling on hyperbola, but with error:
xSample = seq(0.1, 1.0, 0.1)
ySample = 1.0 / xSample
numPts <- length(xSample)
ySample <- ySample + 0.5 * rnorm(numPts) ## Add some noise
## Create x,y points for smooth hyperbola:
xCurve <- seq(0.1, 1.0, 0.001)
yCurve <- 1.0 / xCurve
plot(xSample, ySample, ylim = c(0.0, 12.0)) ## Plot the sample points
lines(xCurve, yCurve, col = 'green', lty = 1) ## Plot the curve