如何在 nls 中动态填充起始值?
How can I dynamically populate start values in nls?
我正在向 nls()
提供动态输入,但我无法使 start
参数起作用。看来我不知道如何喂它正确的对象。我需要正确结构中的对象 vars
来满足 start
参数。
在此示例中,我的起始值存储在 vars
中。我尝试过使用 as.vector
、as.array
和 as.matrix
重塑它以及弄乱对象 class,但没有成功。
#need this package for acm.disjonctif()
library(ade4)
#get some fake data going for an ad measurement scenario
durta <- data.frame (
"impact"=c(150,150,350,50,150,150, 140,160,330,80,130,170)
, "spend"= c(1000,1200,2300,500,1300,1000, 1900,1200,2000,500,1000,1400)
, "adtitle"=c("zip","bang","boom","zip","bang","boom", "zip","bang","boom","zip","bang","boom")
, "network"=c("NBC","TNT","NBC","TNT","NBC","TNT", "NBC","TNT","NBC","TNT","NBC","TNT")
)
#making each element from network and adtitle into its own binary dimension
factors <- acm.disjonctif(durta[,3:4])
#getting rid of pesky byproducts
colnames(factors) <- gsub("network.","",gsub("adtitle.","",colnames(factors)))
#going to feed this to nls
input <- data.frame(cbind("impact"=durta$impact,"spend"=durta$spend,factors))
#also need to send these starting values
vars <- data.frame("var"=as.array(letters)[1:ncol(factors)],"start"=0)
#pasting a dynamic formula based on 'input' using as.formula works fine
#tried a similar solution for the starting values, failed
fit <- nls(
as.formula(paste(paste("impact ~ spend*(", paste(paste(vars[,1],"*"),noquote(colnames(input[3:ncol(input)])), collapse="+")),")"))
, data=input
, algorithm = "port"
, start = vars
#, start = c(a=.1,b=.3,c=0.3,d=-.9,e=.2)
# ^ this version works
)
如果满足 start
参数,那么我应该得到这个(小)错误:
Error in nlsModel(formula, mf, start, wts, upper) :
singular gradient matrix at initial parameter estimates
当我用 var
替换工作静态代码时,我得到:
Error in nls(as.formula(paste(paste("impact ~ spend*(", paste(paste(vars[, :
parameters without starting value in 'data': e
我已经在静态版本中放置了一些合理的起始值来处理这个人为示例的第一个错误,但它仍然会抛出错误。就这样吧。那不是我关心的。
start
需要是一个 命名列表 。于是
start = setNames(as.list(vars$start), vars$var)
似乎做你想做的事(获取 vars$start
中的值向量,将其转换为列表,并使用 vars$var
的相应元素作为其名称)。
就其价值而言,您似乎可以将此特定型号与 lm(impact/spend ~ ., data=input)
...
相匹配
我正在向 nls()
提供动态输入,但我无法使 start
参数起作用。看来我不知道如何喂它正确的对象。我需要正确结构中的对象 vars
来满足 start
参数。
在此示例中,我的起始值存储在 vars
中。我尝试过使用 as.vector
、as.array
和 as.matrix
重塑它以及弄乱对象 class,但没有成功。
#need this package for acm.disjonctif()
library(ade4)
#get some fake data going for an ad measurement scenario
durta <- data.frame (
"impact"=c(150,150,350,50,150,150, 140,160,330,80,130,170)
, "spend"= c(1000,1200,2300,500,1300,1000, 1900,1200,2000,500,1000,1400)
, "adtitle"=c("zip","bang","boom","zip","bang","boom", "zip","bang","boom","zip","bang","boom")
, "network"=c("NBC","TNT","NBC","TNT","NBC","TNT", "NBC","TNT","NBC","TNT","NBC","TNT")
)
#making each element from network and adtitle into its own binary dimension
factors <- acm.disjonctif(durta[,3:4])
#getting rid of pesky byproducts
colnames(factors) <- gsub("network.","",gsub("adtitle.","",colnames(factors)))
#going to feed this to nls
input <- data.frame(cbind("impact"=durta$impact,"spend"=durta$spend,factors))
#also need to send these starting values
vars <- data.frame("var"=as.array(letters)[1:ncol(factors)],"start"=0)
#pasting a dynamic formula based on 'input' using as.formula works fine
#tried a similar solution for the starting values, failed
fit <- nls(
as.formula(paste(paste("impact ~ spend*(", paste(paste(vars[,1],"*"),noquote(colnames(input[3:ncol(input)])), collapse="+")),")"))
, data=input
, algorithm = "port"
, start = vars
#, start = c(a=.1,b=.3,c=0.3,d=-.9,e=.2)
# ^ this version works
)
如果满足 start
参数,那么我应该得到这个(小)错误:
Error in nlsModel(formula, mf, start, wts, upper) : singular gradient matrix at initial parameter estimates
当我用 var
替换工作静态代码时,我得到:
Error in nls(as.formula(paste(paste("impact ~ spend*(", paste(paste(vars[, : parameters without starting value in 'data': e
我已经在静态版本中放置了一些合理的起始值来处理这个人为示例的第一个错误,但它仍然会抛出错误。就这样吧。那不是我关心的。
start
需要是一个 命名列表 。于是
start = setNames(as.list(vars$start), vars$var)
似乎做你想做的事(获取 vars$start
中的值向量,将其转换为列表,并使用 vars$var
的相应元素作为其名称)。
就其价值而言,您似乎可以将此特定型号与 lm(impact/spend ~ ., data=input)
...