2015-01-04 2 views
0

Я пытаюсь соответствовать параболе моих данных в R. я уже создала подгонку в MATLAB (так что я знаю, значение параметров), но когда я запускаю этот код:ошибка при установке параболы в R

library("nls2") 
fo <- y ~ A * (x^2) + B * x + C 
sA <- seq(-.000001,0,len=10) 
sB <- seq(0,.001,len=10) 
sC <- seq(1,20,len=10) 

st1 <- expand.grid(A=sA,B=sB,C=sC) 
mod1 <- nls2(fo,start=st1,algorithm="brute-force") 
z <- nls(fo,start=coef(mod1)) 

x <- c(50072,50072,52536,52536,53768,53768,53768,54384,54384,54384, 54384,54692,54692,54846,54846,54846,54846,54846,54923,54923, 54923,54923,54923,54923,54961.5,54961.5,54961.5,54961.5,54961.5,54961.5,55000,55‌​000,55000) 
y <- c(0.46007,0.47185,0.24377,0.28506,0.16560,0.13587,0.16844, 0.08156,0.06917,0.09357,0.08704,0.02968,0.03293,0.,0.01509, 0.01095,0.005,0.00704,0.00861,0.00287,0.00456,0.01043,0.00373,0.00594, 0.00628,0.00089,0.00085,0.00055,0.00142,0.0022,-0.00091,-0.00209,-0.00293) 

я получаю следующее: г

  A    B    C 
-7.728222e-09 7.177715e-04 -1.610196e+01 
> z 
Nonlinear regression model 
    model: y ~ A * (x^2) + B * x + C 
    data: parent.frame() 
     A   B   C 
-7.728e-09 7.178e-04 -1.610e+01 
residual sum-of-squares: 0.0106 

Number of iterations to convergence: 1 
Achieved convergence tolerance: 4.457e-07 

Но confint(z) дает мне следующее сообщение об ошибке:

Waiting for profiling to be done... 
Error in approx(sp$y, sp$x, xout = cutoff) : 
    need at least two non-NA values to interpolate 

Что пошло не так? Благодаря !

+1

Почему вы используете 'nls' для линейной модели? – Roland

+0

Также, какой пакет 'confine' от? Укажите [воспроизводимый пример] (http://stackoverflow.com/a/5963610/1412059). – Roland

+0

Извините, мой «confint (z)» получил автокорректировать в «confine» –

ответ

2

Поскольку ваша модель является линейной, вы должны использовать lm:

x <- 1:100 
set.seed(42) 
y <- 20 * (x - 30)^2 + 4 + rnorm(100) 

fit <- lm(y ~ poly(x, degree = 2, raw = TRUE)) 
confint(fit) 
#          2.5 %  97.5 % 
#(Intercept)      18003.63406 18004.9075 
#poly(x, degree = 2, raw = TRUE)1 -1200.04169 -1199.9835 
#poly(x, degree = 2, raw = TRUE)2 19.99984 20.0004 

В отличие от этого nls не использует числовой оптимизатор, но вычисляет «точное» решение.

FYI: Модель считается нелинейной, если нелинейность находится в параметрах. y ~ a * x^2 + b * x + c является линейным (по параметрам), но, например, y ~ sin(a - x) нет.

+0

Спасибо! Это решило мою проблему. Любые идеи по сообщению об ошибке (для справки в будущем)? –

+0

Извините, понятия не имею. Если 'confint' терпит неудачу, это часто является признаком плохой подгонки, но из его построения я не вижу проблемы. – Roland

+0

Примечание: если вы не используете 'poly', то обязательно приложите формулу в' I() ', чтобы избежать' * 'и' + 'интерпретируемых как объединение независимых факторов. например lm (y ~ I (a * x^2 + b * x + c)) ' –

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