2017-02-20 9 views
0

nls() 함수를 사용하여 데이터를 맞추려고합니다. 데이터의 특성에 따라 하나의 계수와 두 계수의 합계가 계산됩니다. 짧은 문제를 어디에서 볼 수 있는지 소개해 드리겠습니다. 매개 변수 b1은 0과 1 사이에 있어야하고 매개 변수 b1과 b2의 합은 0과 1 사이에 있어야합니다.nls 계수의 제약

set.seed(123) 

# example where everything is OK 
x <- 1:200 
g <- rbinom(200, 1, 0.5) 
y <- 3 + (0.7 + 0.2 * g) * x 
yeps <- y + rnorm(length(y), sd = 0.1) 

# both parameter b1 and sum of parameters b1 and b2 are between 0 and 1 
nls(yeps ~ a + (b1 + b2 * g) * x, start = list(a = 0.12345, b1 = 0.54321, b2 = 0.4213)) 

# using more extreme values 
x <- 1:200 
g <- rbinom(200, 1, 0.5) 
y <- 3 + (0.9 - 0.99 * g) * x 
yeps <- y + rnorm(length(y), sd = 15) 

# b1 is OK, but b1 + b2 < 0 
nls(yeps ~ a + (b1 + b2 * g) * x, 
    start = list(a = 0.12345, b1 = 0.54321, b2 = 0.4213)) 

# trying constraints, not good, sum is still out of range 
nls(yeps ~ a + (b1 + b2 * g) * x, 
    start = list(a = 0.12345, b1 = 0.54321, b2 = 0.4213), 
    lower = list(a = -Inf, b1 = 0, b2 = -1), 
    upper = list(a = Inf, b1 = 1, b2 = 1), 
    algorithm = "port") 

내가 찾고 어떻게 그런 일이 (작동하지 않습니다)입니다 :

nls(yeps ~ a + (b1 + b2 * g) * x, 
    start = list(a = 0.12345, b1 = 0.54321, b2 = 0.4213), 
    lower = list(a = -Inf, b1 = 0, b2 = -b1), 
    upper = list(a = Inf, b1 = 1, b2 = 1 - b1), 
    algorithm = "port") 

nls() 기능에 다른 매개 변수와 제약 조건을 설정할 수 있습니까? 어떤 제안을 주셔서 감사합니다!

+0

이 [질문] (http://stackoverflow.com/q/11589139/707145)에서보십시오. – MYaseen208

+0

힌트를 보내 주셔서 감사합니다. 그러나'ifelse'가'nls' 함수에서 좋은 접근법인지 확실하지 않습니다. http://stats.stackexchange.com/questions/14561/specifying-parameter-constraints-in-nls – Adela

+0

어쨌든,이 접근법은 각각의 'g' 그룹에 대해 두 모델을 맞추는 것과 어떻게 다릅니 까? – Adela

답변

2

하자 B2 = B1 + B2 그래서 B2 = B2-B1 우리는 후자의 두 그래서 0과 1 사이에있는 A, B1 및 B2의 관점에서 문제를 얻을 B2 위해 B2-B1 치환 :

fm <- nls(yeps ~ a + (b1 + (B2-b1) * g) * x, lower = c(-Inf, 0, 0), upper = c(Inf, 1, 1), 
    start = list(a = 0.1, b1 = 0.5, B2 = 0.1), alg = "port") 

제 (따라서 B2 = B2 - B1 = 0 - 0.9788 = -0.9788) 다음주는

> fm 
Nonlinear regression model 
    model: yeps ~ a + (b1 + (B2 - b1) * g) * x 
    data: parent.frame() 
     a  b1  B2 
-5.3699 0.9788 0.0000 
residual sum-of-squares: 42143 

Algorithm "port", convergence message: both X-convergence and relative convergence (5) 

및 플로팅 :

plot(yeps ~ x) 
points(fitted(fm) ~ x, pch = 20, col = "red") 

screenshot

+0

이것은 훨씬 더 우아한 해결책입니다. 이 힌트를 가져 주셔서 감사합니다! – Adela