2014-12-02 18 views
5

Tôi muốn biết cách hạn chế các thông số nhất định trong lm() để có hệ số dương. Có một vài gói hoặc chức năng (ví dụ: display) có thể làm cho tất cả các hệ số và chặn tích cực.R - Buộc tham số nhất định có hệ số dương trong lm()

Ví dụ: trong ví dụ này, tôi muốn chỉ buộc x1x2 có hệ số dương.

x1=c(NA,rnorm(99)*10) 
    x2=c(NA,NA,rnorm(98)*10) 
    x3=rnorm(100)*10 
    y=sin(x1)+cos(x2)-x3+rnorm(100) 

    lm(y~x1+x2+x3) 

    Call: 
     lm(formula = y ~ x1 + x2 + x3)  
    Coefficients: 
     (Intercept)   x1   x2   x3 
    -0.06278  0.02261  -0.02233  -0.99626 

Tôi đã thử chức năng nnnpls() trong gói 'nnls', nó có thể kiểm soát các dấu hiệu hệ số một cách dễ dàng. Thật không may tôi không thể sử dụng nó do các vấn đề với NA trong dữ liệu vì chức năng này không cho phép NA.

Tôi thấy chức năng glmc() có thể được sử dụng để áp dụng các ràng buộc nhưng tôi không thể làm cho nó hoạt động.

Ai đó có thể cho tôi biết tôi nên làm gì?

Trả lời

2

You can use package penalized:

set.seed(1) 

x1=c(NA,rnorm(99)*10) 
x2=c(NA,NA,rnorm(98)*10) 
x3=rnorm(100)*10 
y=sin(x1)+cos(x2)-x3+rnorm(100) 
DF <- data.frame(x1,x2,x3,y) 

lm(y~x1+x2+x3, data=DF) 
#Call: 
#lm(formula = y ~ x1 + x2 + x3, data = DF) 
# 
#Coefficients: 
#(Intercept)   x1   x2   x3 
# -0.02438  -0.01735  -0.02030  -0.98203 

này mang lại cho giống nhau:

library(penalized) 

mod1 <- penalized(y, ~ x1 + x2 + x3, ~1, 
        lambda1=0, lambda2=0, positive = FALSE, data=na.omit(DF)) 
coef(mod1) 
#(Intercept)   x1   x2   x3 
#-0.02438357 -0.01734856 -0.02030120 -0.98202831 

Nếu bạn hạn chế các hệ số của x1x2 là tích cực, họ trở thành số không (như dự kiến):

mod2 <- penalized(y, ~ x1 + x2 + x3, ~1, 
        lambda1=0, lambda2=0, positive = c(T, T, F), data=na.omit(DF)) 
coef(mod2) 
#(Intercept)   x3 
#-0.03922266 -0.98011223 
+0

Cảm ơn, bạn đã nói "Nếu bạn hạn chế các hệ số x1 và x2 là dương, chúng trở thành 0 (như mong đợi)", nhưng tại sao lại là? Ngoài ra, trong hàm bị phạt(), có vẻ như bạn phải xác định từng thông số là dương hoặc âm, bạn có thể làm cho chúng trở nên miễn phí (ví dụ: lambda3 có thể dương hoặc âm mà không cần chỉ định). –

+0

Không, 'positive = FALSE' có nghĩa là" miễn phí ". Ngoài ra, nếu số tiền tối thiểu thực tế của tổng các ô vuông xảy ra cho các ước tính âm, thì có khả năng là mức tối thiểu trong không gian tham số bị ràng buộc xảy ra với số không. – Roland

+0

Điều này sẽ thú vị hơn nếu không có gói nào được tham gia; nói rằng người ta sẽ muốn áp dụng nó trong một thiết lập không phải là OLS. –

0

Câu hỏi cũ nhưng vì câu hỏi vẫn thu hút tention:

Bạn có thể sử dụng gói colf cho việc này. Nó hiện đang cung cấp hai phương nhỏ nhất tối ưu phi tuyến tính, cụ thể là nls hoặc nlxb:

library(colf) 

colf_nlxb(y ~ x1 + x2 + x3, data = DF, lower = c(-Inf, 0, 0, -Inf)) 
#nlmrt class object: x 
#residual sumsquares = 169.53 on 98 observations 
# after 3 Jacobian and 3 function evaluations 
#    name  coeff SEs tstat pval gradient JSingval 
#1 param_X.Intercept. -0.0066952 NA NA NA 3.8118 103.3941 
#2   param_x1 0.0000000 NA NA NA 103.7644 88.7017 
#3   param_x2 0.0000000 NA NA NA 0.0000 9.8032 
#4   param_x3 -0.9487088 NA NA NA 330.7776 0.0000 

colf_nls(y ~ x1 + x2 + x3, data = DF, lower = c(-Inf, 0, 0, -Inf)) 
#Nonlinear regression model 
# model: y ~ param_X.Intercept. * X.Intercept. + param_x1 * x1 + param_x2 *   
# x2 + param_x3 * x3 
# data: model_ingredients$model_data 
#param_X.Intercept.   param_x1   param_x2   param_x3 
#   -0.0392    0.0000    0.0000   -0.9801 
# residual sum-of-squares: 159 
# 
#Algorithm "port", convergence message: both X-convergence and relative convergence (5) 

Bạn có thể đặt lower và/hoặc upper giới hạn để xác định các giới hạn như bạn muốn cho mỗi một trong số các hệ số.

Các vấn đề liên quan