2017-02-20 5 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 и подставив B2-B1 для b2 мы получаем проблему с точки зрения а, В1 и В2, из которых последние два находятся между 0 и 1, так:

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 = В2 - 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

Смежные вопросы