提问人:ChrisO 提问时间:8/17/2023 最后编辑:MrFlickChrisO 更新时间:8/17/2023 访问量:45
对 R 中具有单个 x 列和多个 y 列的表中的数据执行非线性回归
Perform non-linear regression on data from a table with single x column and several y columns in R
问:
我有一个数据表,其中包含我想要非线性拟合的实验数据。数据包含在一个表中,第一列包含 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
有没有一个优雅的解决方案? 提前非常感谢! 克里斯
答:
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
罗兰,非常感谢!你的代码就像一个魅力!你救了我的一天!
评论
x ~ y3
x ~ y2
x ~ y1
y*
y1