нелинейна регресия в R с множество набори от данни

Уча R и в момента го използвам за нелинейна регресия (която също уча). Имам два набора от данни (продължителност на операция на различни машини) и мога да намеря добра нелинейна регресия за всеки от тези набори. Сега бих искал да намеря най-добрата регресия, която минимизира сумата от двата остатъчни сбора на квадратите.

Ето какво имам:

A <- c(1:5)
B <- c(100, 51, 32, 24, 19)
C <- c(150, 80, 58, 39, 29)

df <- data.frame (A,B,C)

f <- B ~ k1/A + k2
g <- C ~ k1/A + k2

n <- nls(f, data = df, start = list(k1=10, k2=10))
p <- nls(g, data = df, start = list(k1=10, k2=10))
n
#Nonlinear regression model
#  model: B ~ k1/A + k2
#   data: df
#     k1      k2 
#101.595  -1.195 
# residual sum-of-squares: 2.619

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

p
#Nonlinear regression model
#  model: C ~ k1/A + k2
#   data: df
#     k1      k2 
#148.044   3.593 
# residual sum-of-squares: 54.19

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

k1 и k2 константите са (разбира се) различни и за двата набора (B и C), чудя се как бих могъл да намеря конкретен k1 и конкретен k2, които произвеждат „най-доброто“ решение и за двата набора от данни.

Надявам се обяснението ми да е разбираемо. В противен случай това, което се опитвам да намеря, е понякога (поне тук), наречена глобална нелинейна регресия.

РЕДАКТИРАНЕ: Бих искал също да знам как мога да кажа на R да избягва отрицателни стойности за конкретен параметър. В този случай бих искал k2 да е положително.


person claf    schedule 04.09.2013    source източник


Отговори (1)


Ако искате идентични параметри, трябва просто да обедините вашите данни:

df2 <- data.frame(Y=c(df$B,df$C), X=rep(df$A, 2))
p <- nls(Y ~ k1/X + k2, 
         data = df2, 
         start = list(k1=10, k2=10), 
         lower = c(0, 0), 
         algorithm = "port")
summary(p)

#  Formula: Y ~ k1/X + k2
#  
#  Parameters:
#    Estimate Std. Error t value Pr(>|t|)    
#  k1  124.819     18.078   6.904 0.000124 ***
#    k2    1.199      9.781   0.123 0.905439    
#  ---
#    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#  
#  Residual standard error: 16.59 on 8 degrees of freedom
#  
#  Algorithm "port", convergence message: both X-convergence and relative convergence (5)

Редактиране:

Ако искате един параметър да бъде равен, а един да варира, можете да използвате модел със смесени ефекти. Въпреки това, не знам как да посоча ограничения за това (вярвам, че това не е проста задача, но може да бъде постигнато чрез препараметризация).

library(nlme)

library(reshape2)
df3 <- melt(df, id.vars="A")

r <- nlme(value ~ k1/A + k2, 
          data = df3, 
          start = c(k1=10, k2=10), 
          fixed = k1 + k2 ~1,
          random = k2 ~ 1|variable)

summary(r)
#  Nonlinear mixed-effects model fit by maximum likelihood
#  Model: value ~ k1/A + k2 
#  Data: df3 
#  AIC      BIC    logLik
#  83.11052 84.32086 -37.55526
#  
#  Random effects:
#    Formula: k2 ~ 1 | variable
#                k2 Residual
#  StdDev: 12.49915 7.991013
#  
#  Fixed effects: k1 + k2 ~ 1 
#         Value Std.Error DF   t-value p-value
#  k1 124.81916  9.737738  7 12.818086  0.0000
#  k2   1.19925 11.198211  7  0.107093  0.9177
#  Correlation: 
#         k1    
#  k2 -0.397
#  
#  Standardized Within-Group Residuals:
#    Min         Q1        Med         Q3        Max 
#  -1.7520706 -0.5273469  0.2746039  0.5235343  1.4971808 
#  
#  Number of Observations: 10
#  Number of Groups: 2 

coef(r)
#          k1        k2
#  B 124.8192 -10.81835
#  C 124.8192  13.21684
person Roland    schedule 04.09.2013
comment
Така че предполагам, че „lower=c(0,0)“ са минимални стойности за k1 и k2? Какво ще кажете за алгоритъма на порта? добре, ще го потърся в гугъл :) - person claf; 04.09.2013
comment
Винаги ли е начинът, по който човек трябва да прави нелинейна регресия на множество набори от данни? Какво ще стане, ако искам k1 да се споделя и за двата набора от данни, а k2 може да бъде специфичен? - person claf; 04.09.2013
comment
@claferri Да, lower уточнява ограниченията. Ако имате нужда от долни или горни граници, трябва да използвате алгоритъма за порт с nls. Прочетете help("nls"). - person Roland; 04.09.2013
comment
@ Roland с nlme, възможно ли е да се уточни, че k2 трябва да е положителен? Бихте ли обяснили накратко и „фиксирания“ и „произволния“ синтаксис? - person claf; 04.09.2013
comment
Изглежда ТОЛКОВА да потисна @Roland в моите коментари, трябваше да поставя интервал между @ и Roland ... странно! - person claf; 04.09.2013
comment
@claferri Потиснат е, защото така или иначе получавам известия за коментари към моя отговор. Както написах в отговора, не знам начин да посоча изрично ограничения в nlme. Ако не сте запознати с моделите със смесени ефекти, тук не е мястото да ги обяснявате. Синтаксисът е обяснен в документацията на функцията. - person Roland; 04.09.2013
comment
Всъщност се опитвам да модифицирам моя модел, за да добавя параметър k3, който трябва да бъде специфичен за набор от данни като k2, но не мога да намеря начин да го добавя във „фиксиран“ и „случаен“, документацията на nlme не е достатъчно ясна за мен постоянно получавам грешки. - person claf; 04.09.2013
comment
Нещо като nlme(value ~ k1/A + k2 + k3*A, data = df3, start = c(k1=10, k2=10, k3=10), fixed = k1 + k2 + k3 ~1,random = k2 + k3 ~ 1|variable)? - person Roland; 04.09.2013
comment
Това опитах, предполагам, че грешката означава нещо друго. Благодаря все пак за помощта! - person claf; 04.09.2013
comment
Трудно е да се каже без съобщението за грешка. Може да са проблеми с конвергенцията или прекомерно оборудване или редица други проблеми. - person Roland; 04.09.2013
comment
Опитвам nlme(value ~ k1/(k3*A) + k2, data = df3, start = c(k1=10, k2=10, k3=10), fixed = k1 + k2 + k3 ~1,random = k2 + k3 ~ 1|variable) и предполагам, че това са нещата, които не мога да правя с nlme. Грешката е нещо като коефициентът на намаляване на всеки етап е намален под минималната стъпка към PNLS (грешката ми е на френски, поради което не съм сигурен за превода на PNLS). - person claf; 04.09.2013
comment
@claferri Този проблем няма нищо общо с nlme. k1/(k3*A) + k2 може да се опрости до k4/A + k2. Математически не е възможно да се разделят k1 и k3. - person Roland; 04.09.2013
comment
Това предполагах, но си помислих, че може би фактът, че k1 е глобален, а k3 не е, може да промени проблема... Моят опит в математиката изглежда е слаб :). Надяваме се, че сега разбирам защо това не променя нищо! :) - person claf; 05.09.2013