2014-12-02 53 views
5

我想知道如何限制lm()中的某些參數具有正係數。有一些軟件包或功能(例如display)可以使所有係數和攔截正確。R - 強制某些參數在lm()中具有正係數

例如,在這個例子中,我想只強制x1x2有正係數。

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 

我已經在包'nnls'試圖功能nnnpls(),它可以容易地控制係數的標誌。不幸的是,由於數據中的NA問題,我不能使用它,因爲這個功能不允許NA。

我看到函數glmc()可以用來應用約束,但我無法得到它的工作。

有人能告訴我該怎麼辦?

回答

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 

這給出相同:

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 

如果約束x1x2係數是積極的,他們成爲零(預期):

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

謝謝,你說過「如果你把x1和x2的係數限制爲正值,它們就會變成零(如預期的)」,但爲什麼呢?另外,在函數罰(),似乎你必須定義每個參數是正面還是負面,你可以讓它們自由(例如,lambda3可以正面或負面,沒有我們指定它)。 – 2014-12-02 10:45:22

+0

不,「positive = FALSE」的意思是「免費」。此外,如果平方和的實際最小值出現負值估計值,則極有可能是受限參數空間中的最小值發生爲零。 – Roland 2014-12-02 10:54:46

+0

如果沒有包裹被涉及,這將會更有趣;說一個人會想在非OLS設置中應用它。 – 2017-10-19 22:34:32

0

老問題,但因爲它仍然吸引tention:

您可以使用包colf爲此。目前,它提供了兩個最小二乘非線性優化,即nlsnlxb

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界限,只要你喜歡的係數的每一個指定的極限。