如何将循环结果作为 nlslm 模型的初始参数传递?
How to pass loop results as initial parameters for nlslm model?
我是运行一个需要初始值才能开始的非线性回归模型,但我想要包含的变量数量可能太大,无法手动输入所有值 - 因此我想知道是否有一个替代方案。
set.seed(12345)
y = rnorm(100, 1000,150)
x1 = rnorm(100,10000,251)
x2 = rnorm(100, 3000,654)
x3 = rnorm(100, 25000,100)
x4 = rnorm(100, 200000,589)
x5 = rnorm(100, 31657,296)
adstock <- function(x,rate=0){
return(as.numeric(stats::filter(x=log(x+1),filter=rate,method="recursive")))
}
library(minpack.lm)
nlsLM(y~b0
+ b1 * adstock(x1, r1)
+ b2 * adstock(x2, r2)
+ b3 * adstock(x3, r3)
+ b4 * adstock(x4, r4)
+ b5 * adstock(x5, r5)
, algorithm = "LM"
# this is where I need to paste the results from the loop
, start = c(b0=1,b1=1,b2=1,b3=1,b4=1,b5=1
,r1=0.1,r2=0.1,r3=0.1,r4=0.1,r5=0.1
)
# end
, control = list(maxiter = 200)
)
我的想法是使用循环将值传递给模型,但我无法使其工作(以下代码应该用于 b_i 系数)
test_start <- NULL
for(i in 1:(5+1)) {
test_start[i] = paste0("b",i-1,"=",1)
}
cat(test_start)
这是结果,与模型预期的不完全相同:
b0=1 b1=1 b2=1 b3=1 b4=1 b5=1
如何将循环的结果传递给模型?
另外,如何将 r_i 起始系数添加到循环中的 b_i 起始系数?
任何帮助将不胜感激。
PS:目前我有兴趣为每个 b0、b1、...、b5 和每个 r1、r2、...分配相同的值(在本例中为 1) ,r5 相同的值(在本例中为 0.1)
定义数据为DF
,公式为fo
,然后grep出b
和r
变量。定义 v
的行创建一个带有它们名称的向量,定义 st
的行创建一个命名向量,b
的值为 1,r
的值为 0.1。
DF <- data.frame(y, x1, x2, x3, x4, x5)
n <- ncol(DF) - 1
rhs <- c("b0", sprintf("b%d * adstock(x%d, r%d)", 1:n, 1:n, 1:n))
fo <- reformulate(rhs, "y")
v <- grep("[br]", all.vars(fo), value = TRUE)
st <- setNames(grepl("b", v) + 0.1 * grepl("r", v), v)
st
nlsLM(fo, DF, start = st, algorithm = "LM", control = list(maxiter = 200))
关于评论尝试这样定义 rhs
。在第一行中,取你想要的 labs
的任何子集,例如labs <- labels(...)[1:9]
或更改第一行的公式,例如labs <- labels(terms(y ~ .*(1 + x1), data = DF))
labs <- labels(terms(y ~ .^2, data = DF))
labs <- sub(":", "*", labs)
n <- length(labs)
rhs <- c("b0", sprintf("b%d * adstock(%s, r%d)", 1:n, labs, 1:n))
我是运行一个需要初始值才能开始的非线性回归模型,但我想要包含的变量数量可能太大,无法手动输入所有值 - 因此我想知道是否有一个替代方案。
set.seed(12345)
y = rnorm(100, 1000,150)
x1 = rnorm(100,10000,251)
x2 = rnorm(100, 3000,654)
x3 = rnorm(100, 25000,100)
x4 = rnorm(100, 200000,589)
x5 = rnorm(100, 31657,296)
adstock <- function(x,rate=0){
return(as.numeric(stats::filter(x=log(x+1),filter=rate,method="recursive")))
}
library(minpack.lm)
nlsLM(y~b0
+ b1 * adstock(x1, r1)
+ b2 * adstock(x2, r2)
+ b3 * adstock(x3, r3)
+ b4 * adstock(x4, r4)
+ b5 * adstock(x5, r5)
, algorithm = "LM"
# this is where I need to paste the results from the loop
, start = c(b0=1,b1=1,b2=1,b3=1,b4=1,b5=1
,r1=0.1,r2=0.1,r3=0.1,r4=0.1,r5=0.1
)
# end
, control = list(maxiter = 200)
)
我的想法是使用循环将值传递给模型,但我无法使其工作(以下代码应该用于 b_i 系数)
test_start <- NULL
for(i in 1:(5+1)) {
test_start[i] = paste0("b",i-1,"=",1)
}
cat(test_start)
这是结果,与模型预期的不完全相同:
b0=1 b1=1 b2=1 b3=1 b4=1 b5=1
如何将循环的结果传递给模型? 另外,如何将 r_i 起始系数添加到循环中的 b_i 起始系数? 任何帮助将不胜感激。
PS:目前我有兴趣为每个 b0、b1、...、b5 和每个 r1、r2、...分配相同的值(在本例中为 1) ,r5 相同的值(在本例中为 0.1)
定义数据为DF
,公式为fo
,然后grep出b
和r
变量。定义 v
的行创建一个带有它们名称的向量,定义 st
的行创建一个命名向量,b
的值为 1,r
的值为 0.1。
DF <- data.frame(y, x1, x2, x3, x4, x5)
n <- ncol(DF) - 1
rhs <- c("b0", sprintf("b%d * adstock(x%d, r%d)", 1:n, 1:n, 1:n))
fo <- reformulate(rhs, "y")
v <- grep("[br]", all.vars(fo), value = TRUE)
st <- setNames(grepl("b", v) + 0.1 * grepl("r", v), v)
st
nlsLM(fo, DF, start = st, algorithm = "LM", control = list(maxiter = 200))
关于评论尝试这样定义 rhs
。在第一行中,取你想要的 labs
的任何子集,例如labs <- labels(...)[1:9]
或更改第一行的公式,例如labs <- labels(terms(y ~ .*(1 + x1), data = DF))
labs <- labels(terms(y ~ .^2, data = DF))
labs <- sub(":", "*", labs)
n <- length(labs)
rhs <- c("b0", sprintf("b%d * adstock(%s, r%d)", 1:n, labs, 1:n))