对 R 中具有单个 x 列和多个 y 列的表中的数据执行非线性回归

Perform non-linear regression on data from a table with single x column and several y columns in R

提问人:ChrisO 提问时间:8/17/2023 最后编辑:MrFlickChrisO 更新时间:8/17/2023 访问量:45

问:

我有一个数据表,其中包含我想要非线性拟合的实验数据。数据包含在一个表中,第一列包含 x 值,所有后续列包含来自不同测量值的 y 数据。我猜通过拟合方法有 2 个参数,称为 A 和 B。 例如:

    x y1 y2 y3 y4
    2 60 100 129 189
    5 90 118 156 200
    10 114 145 178 225 (all data random, not real)

我设法使用 NLS 拟合 x 和 y1 列(工作起来很有吸引力,这要归功于这里找到的几篇文章:-)),逐列提取 y 值的子集。现在我想递归地将所有 y 列与 x 拟合,并将 a 和 b 的相应值保存在另一个表中。

到目前为止,我这样做了:

    x<-trx_data[,c(1)]
    y_383.2<-trx_data[,c(2)] #corresponds to y1
    df<-data.frame(x,y_383.2) #define a new data table with x and y1
    colnames(df)<-c("x","y")  #rename the columns
    start_values<-c(a=20,b=2) #set starting values
    #perform fitting
    m_HB<-nls(y~x+a*sqrt(b*x/a+1),
          data = df,
          start = start_values,
          algorithm="plinear")
    summary(m_HB)

现在我想创建一个数据表,如下所示:

    383.2  383.3 383.4 #column names, extracted from input table
    40     46    49    #parameter a
    7      13    9     #parameter b

有没有一个优雅的解决方案? 提前非常感谢! 克里斯

R 递归 NLS

评论

1赞 r2evans 8/17/2023
你说“递归”......对我来说,这表明回归依赖于回归的结果,而回归本身依赖于 。是吗?或者你是否试图以类似于你所做的事情的方式“迭代”所有值?x ~ y3x ~ y2x ~ y1y*y1
0赞 ChrisO 8/17/2023
@r2evans:感谢您的评论,我确实尝试迭代 y* 值。

答:

3赞 Roland 8/17/2023 #1

我想你想把 yi 作为因变量进行迭代。 专为此而设计:nlme::nlsList

library(data.table)

DF <- fread("x y1 y2 y3 y4
2 60 100 129 189
5 90 118 156 200
10 114 145 178 225")

#reshape data
DF <- melt(DF, id.vars = "x", value.name = "y")

library(nlme)
start_values<-c(a=20,b=2)
fits <- nlsList(y~x+a*sqrt(b*x/a+1) | variable, data = DF, 
                start = start_values, pool = FALSE)
summary(fits)
#Call:
#  Model: y ~ x + a * sqrt(b * x/a + 1) | variable 
#   Data: DF 
#
#Coefficients:
#   a 
#    Estimate Std. Error    t value    Pr(>|t|)
#y1  41.13625 10.1776110   4.041838 0.154406790
#y2  86.18704  0.3414589 252.408273 0.002522169
#y3 117.42132  7.9259599  14.814775 0.042906863
#y4 178.05209  2.9667743  60.015382 0.010606629
#   b 
#    Estimate Std. Error   t value    Pr(>|t|)
#y1 23.307477  9.2938091  2.507850 0.241550461
#y2 12.499029  0.1625046 76.914935 0.008276467
#y3 12.902568  3.4640896  3.724664 0.166982283
#y4  7.963814  1.0728033  7.423369 0.085245708

t(coef(fits))
#        y1       y2        y3         y4
#a 41.13625 86.18704 117.42132 178.052091
#b 23.30748 12.49903  12.90257   7.963814

请注意,我省略了,因为您没有指定任何部分线性(并且模型确实不是部分线性的)。algorithm="plinear"

评论

0赞 ChrisO 8/17/2023
罗兰,非常感谢你的回答。不幸的是,我在运行 nlsList 时收到一条错误消息:“nlsList.formula(y ~ x + a * sqrt(b * x/a + 1), data = df, start = start_values, : 'data' must be a ”groupedData“ object if 'formula' doesn't include groups”.现在我看到了我的错误:我只在 x 和 y1 上运行了 nlsList。我现在尝试修复它!谢谢!
0赞 ChrisO 8/17/2023
罗兰,非常感谢!你的代码就像一个魅力!你救了我的一天!