【问题标题】:nonlinear regression in R with multiple data setsR中具有多个数据集的非线性回归
【发布时间】:2013-09-04 09:06:33
【问题描述】:

我正在学习 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 来为这两个数据集产生“最佳”解决方案。

希望我的解释是可以理解的。否则,我试图找到的有时(至少here)称为全局非线性回归。

编辑:我也想知道如何告诉 R 避免特定参数的负值。在这种情况下,我希望 k2 为正数。

【问题讨论】:

    标签: r regression nonlinear-optimization


    【解决方案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
    

    【讨论】:

    • 所以我猜 'lower=c(0,0)' 是 k1 和 k2 的最小值? “端口”算法呢?好的,我会用谷歌搜索那个:)
    • 是否总是应该对多个数据集进行非线性回归?如果我想为两个数据集共享 k1 并且 k2 可以是特定的怎么办?
    • @claferri 是的,lower 指定了约束。如果您需要下限或上限,则必须使用带有nls 的“端口”算法。阅读help("nls")
    • @Roland with nlme,是否可以指定 k2 必须为正数?你能简单解释一下“固定”和“随机”的语法吗?
    • 似乎在我的 cmets 中抑制了“@Roland”,不得不在 @ 和 Roland 之间放置空格……很奇怪!
    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 2016-12-19
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2021-04-28
    • 2015-01-02
    相关资源
    最近更新 更多