Tôi muốn thực hiện một hồi quy tuyến tính rất đơn giản trong R
. Công thức đơn giản như . Tuy nhiên, tôi muốn độ dốc ( ) nằm trong một khoảng, giả sử, giữa 1,4 và 1,6.
Điều này có thể giải quyết như thế nào?
Tôi muốn thực hiện một hồi quy tuyến tính rất đơn giản trong R
. Công thức đơn giản như . Tuy nhiên, tôi muốn độ dốc ( ) nằm trong một khoảng, giả sử, giữa 1,4 và 1,6.
Điều này có thể giải quyết như thế nào?
Câu trả lời:
Tôi muốn thực hiện ... hồi quy tuyến tính trong R. ... Tôi muốn độ dốc nằm trong một khoảng, giả sử, trong khoảng từ 1,4 đến 1,6. Điều này có thể giải quyết như thế nào?
(i) Cách đơn giản:
phù hợp với hồi quy. Nếu nó nằm trong giới hạn, bạn đã hoàn thành.
Nếu nó không nằm trong giới hạn, hãy đặt độ dốc về giới hạn gần nhất và
ước tính mức chặn là trung bình của trên tất cả các quan sát.
(ii) Cách phức tạp hơn: thực hiện các hình vuông nhỏ nhất với các ràng buộc hộp trên dốc; nhiều thói quen tối ưu thực hiện các ràng buộc hộp, ví dụ nlminb
(đi kèm với R).
Chỉnh sửa: thực sự (như được đề cập trong ví dụ dưới đây), trong vanilla R, nls
có thể thực hiện các ràng buộc hộp; như trong ví dụ, điều đó thực sự rất dễ thực hiện.
Bạn có thể sử dụng hồi quy bị ràng buộc trực tiếp hơn; Tôi nghĩ rằng pcls
chức năng từ gói "mgcv" và nnls
chức năng từ gói "nnls" đều làm.
-
Chỉnh sửa để trả lời câu hỏi tiếp theo -
Tôi sẽ chỉ cho bạn cách sử dụng nó với nlminb
R, nhưng tôi nhận ra rằng nls
đã sử dụng cùng một thói quen (các thói quen PORT) để thực hiện các bình phương tối thiểu bị ràng buộc, vì vậy ví dụ của tôi dưới đây là trường hợp đó.
Đầu tiên, thiết lập một số dữ liệu với độ dốc 'thật' trong phạm vi:
set.seed(seed=439812L)
x=runif(35,10,30)
y = 5.8 + 1.53*x + rnorm(35,s=5) # population slope is in range
plot(x,y)
lm(y~x)
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept) x
12.681 1.217
... nhưng ước tính LS nằm ngoài nó, chỉ do biến đổi ngẫu nhiên. Vì vậy, hãy sử dụng hồi quy bị ràng buộc trong nls
:
nls(y~a+b*x,algorithm="port",
start=c(a=0,b=1.5),lower=c(a=-Inf,b=1.4),upper=c(a=Inf,b=1.6))
Nonlinear regression model
model: y ~ a + b * x
data: parent.frame()
a b
9.019 1.400
residual sum-of-squares: 706.2
Algorithm "port", convergence message: both X-convergence and relative convergence (5)
Như bạn thấy, bạn có một độ dốc ngay trên ranh giới. Nếu bạn chuyển mô hình được trang bị cho summary
nó thậm chí sẽ tạo ra các lỗi và giá trị t tiêu chuẩn nhưng tôi không chắc chúng có ý nghĩa / diễn giải như thế nào.
b=1.4
c(a=mean(y-x*b),b=b)
a b
9.019376 1.400000
Đó là cùng một ước tính ...
Trong ô bên dưới, đường màu xanh là hình vuông nhỏ nhất và đường màu đỏ là hình vuông nhỏ nhất bị ràng buộc:
nls
để làm điều đó.
Phương pháp thứ hai của Glen_b, sử dụng bình phương tối thiểu với ràng buộc hộp có thể được thực hiện dễ dàng hơn thông qua hồi quy sườn. Giải pháp cho hồi quy sườn có thể được xem là Lagrangian cho hồi quy với giới hạn về độ lớn của chỉ tiêu của vectơ trọng lượng (và do đó độ dốc của nó). Vì vậy, theo gợi ý của người bán hàng dưới đây, cách tiếp cận sẽ là trừ đi một xu hướng (1.6 + 1.4) / 2 = 1.5 và sau đó áp dụng hồi quy sườn và tăng dần tham số sườn cho đến khi độ lớn của độ dốc nhỏ hơn hoặc bằng 0,1.
Lợi ích của phương pháp này là không yêu cầu các công cụ tối ưu hóa ưa thích, chỉ cần regresson, đã có sẵn trong R (và nhiều gói khác).
Tuy nhiên, giải pháp đơn giản của Glen_b (i) có vẻ hợp lý với tôi (+1)
Kết quả này sẽ vẫn đưa ra các khoảng đáng tin cậy của các tham số quan tâm (tất nhiên ý nghĩa của các khoảng này sẽ dựa trên tính hợp lý của thông tin trước đó của bạn về độ dốc).
Một cách tiếp cận khác có thể là cải tổ hồi quy của bạn thành một vấn đề tối ưu hóa và sử dụng trình tối ưu hóa. Tôi không chắc liệu nó có thể được điều chỉnh theo cách này không, nhưng tôi đã nghĩ đến câu hỏi này khi tôi đọc blog này đăng trên R tối ưu hóa:
http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html