Заставить определенные параметры иметь положительные коэффициенты в lm ()

Я хотел бы знать, как ограничить определенные параметры в lm(), чтобы они имели положительные коэффициенты. Есть несколько пакетов или функций (например, display), которые могут делать все коэффициенты и точку пересечения положительными.

Например, в этом примере я хотел бы заставить только x1 и x2 иметь положительные коэффициенты.

    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

Я пробовал функцию nnnpls() в пакете nnls, она легко может управлять знаком коэффициента. К сожалению, я не могу использовать его из-за проблем с NAs в данных, поскольку эта функция не позволяет NA.

Я видел, что функцию glmc() можно использовать для наложения ограничений, но я не мог заставить ее работать.

Может ли кто-нибудь сообщить мне, что мне делать?


person Yu Deng    schedule 02.12.2014    source источник


Ответы (3)


Вы можете использовать штрафные пакеты:

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  

Это дает то же самое:

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 

Если вы ограничиваете коэффициенты x1 и x2 положительными, они становятся равными нулю (как и ожидалось):

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 
person Roland    schedule 02.12.2014
comment
Спасибо, вы сказали, что если ограничить коэффициенты при x1 и x2 положительными, они станут равными нулю (как и ожидалось), но почему? Кроме того, в функции Penized () кажется, что вам нужно определить каждый параметр как положительный или отрицательный, можете ли вы сделать их свободными (например, лямбда3 может быть положительным или отрицательным без нашего указания). - person Yu Deng; 02.12.2014
comment
Нет, positive = FALSE означает бесплатно. Кроме того, если фактический минимум суммы квадратов встречается для отрицательных оценок, вполне вероятно, что минимум в ограниченном пространстве параметров имеет место для нуля. - person Roland; 02.12.2014
comment
Это было бы более интересно, если бы не использовался никакой пакет; говорят, что можно было бы применить его в настройке, отличной от OLS. - person Hercules Apergis; 20.10.2017

Вы можете использовать для этого пакет colf. В настоящее время он предлагает два нелинейных оптимизатора наименьших квадратов, а именно nls или 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)

Вы можете установить границы lower и / или upper, чтобы указать пределы по своему усмотрению для каждого из коэффициентов.

person LyzandeR    schedule 15.12.2016

С ConsReg https://cran.r-project.org/web/packages/ConsReg/index.html package, вы можете справиться с подобными проблемами.

Вы можете установить ограничения (нижний и верхний), а также ограничения в пределах коэффициентов, например beta1 ›beta2, что в некоторых случаях может быть очень полезно.

person Josep Puig    schedule 12.04.2020
comment
Пожалуйста, включите раскрытие информации в свое сообщение при размещении сообщений о своих проектах. - person Martijn Pieters; 12.04.2020