如何解决在R中的函数中使用nlsLM执行非线性回归
我想在现有方程式中添加一个修正因子以拟合数据。原始方程式是通过函数定义的,因为变量N_l
是数字的向量,并且函数通过遍历向量N_l
中的所有可能值来选择方程式的最大结果。原始功能定义为:
library(utils)
R <- function(x){
N_b <- x[1]
N_l <- x[2]
A <- x[3]
x.sqr <- x[4]
S <- x[10]
e <- x[grepl("e_\\d",names(x))]
f <- sapply(seq(N_l),function(k) max(Multi.Presence$m[k] * ((k/N_b) +
(A * combn(e,k,sum) / x.sqr))))
c(val = max(f),pos = which.max(f))
}
DATA.GIRDER1 <- cbind(DATA.GIRDER1,vars = t(apply(DATA.GIRDER1,1,R)))
colnames(DATA.GIRDER1)[12:13] <- c("Proposed.Girder1","Lanes")
函数中定义的方程为:
提供了数据帧DATA.GIRDER1
和数据帧Multi.Presence
的前5行:
> dput(DATA.GIRDER1[(1:5),]
structure(list(N_b = c(5,5,5),N_l = c(4,4,4),A = c(-12,-12,-12),x.sqr = c(1440,1440,1440),e_1 = c(21.8,21.8,21.8),e_2 = c(9.8,9.8,9.8),e_3 = c(-2.2,-2.2,-2.2),e_4 = c(-14.2,-14.2,-14.2),e_5 = c(0,0),S = c(12,12,12),R = c(0.59189685884369,0.583646426252063,0.556293941275237,0.576160481501275,0.597435112708129)),row.names = c(NA,5L),class = "data.frame")
> dput(Multi.Presence)
structure(list(N_l = c(1,2,3,6,7,8,9,10),m = c(1.2,0.85,0.65,0.65)),-10L),class = "data.frame")
适合该方程式的理论数据为CSi.Girder1
。目前,该函数的设置方式为数据帧R
的每一行计算最大值DATA.GIRDER1
。
我想将基于数据帧DATA.GIRDER1
中变量S的回归项添加到方程的第二部分,以找到参数a
和b
以最适合{{ 1}}。所需的输出将实现以下等式:
要使用CSi.Girder1
,我需要为方程式定义一个函数,例如:
nlsLM
但是这不成功,我得到了错误:
library(minpack.lm)
Prposed.Girder1 <- function(N_b,N_l,A,x.sqr,e_1,e_2,e_3,e_4,e_5,S,a,b) {
R <- function(x){
N_b <- x[1]
N_l <- x[2]
A <- x[3]
x.sqr <- x[4]
e <- x[grepl("e_\\d",names(x))]
f <- sapply(seq(N_l),function(k) max(Multi.Presence$m[k] * ((k/N_b) +
(A * combn(e,sum) / x.sqr) * (b*S^a))))
c(val = max(f),pos = which.max(f))
}
DATA.GIRDER1 <- cbind(DATA.GIRDER1,R)))
colnames(DATA.GIRDER1)[12:13] <- c("Proposed.Girder1","Lanes")
return(R)
}
Girder1_nlsLM <- nlsLM(R ~ Prposed.Girder1(N_b,b),data = DATA.GIRDER1,start = c(a = 0.01,b = 0.01))
summary(Girder1_nlsLM)
如何使用变量Error in model.frame.default(formula = ~R + N_b + N_l + A + x.sqr + e_1 + :
object is not a matrix
添加此修改因子以求解参数S
和a
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。