2014-12-02 2 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 

: 당신이 긍정적으로 x1x2의 계수를 제약 조건 경우

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 

, 그들은 될 (예상대로)는 0 :

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의 계수를 양수로 제한하면 예상대로 0이됩니다."하지만 왜 그런가? 또한 penalized() 함수에서 각 매개 변수를 양수 또는 음수로 정의해야합니다. 매개 변수를 자유롭게 만들 수 있습니까 (예 : lambda3은 양수 또는 음수 일 수 있습니다). –

+0

아니요, 'positive = FALSE'는 '무료'를 의미합니다. 또한, 제곱합의 실제 최소값이 음의 추정치에 대해 발생하는 경우, 제한된 매개 변수 공간의 최소값이 0으로 나타날 가능성이 큽니다. – Roland

+0

패키지가 포함되지 않으면 더 재미있을 것입니다. OLS가 아닌 설정에서 적용하려고한다고 가정 해보십시오. –

0

이전 질문이지만 아직까지 끈기가 있습니다. tention :

이 경우 패키지 colf을 사용할 수 있습니다.

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 경계를 설정할 수 있습니다 : 그것은 현재이 최소 제곱 비선형 최적화, 즉 nls 또는 nlxb을 제공합니다.

관련 문제