R-如何在NLS中动态填充启动值



我正在将动态输入馈送到nls()中,但是我无法使start参数可以工作。看来我不知道如何将其喂养正确的对象。我需要正确结构中的对象vars来满足start参数。

在此示例中,我的启动值存储在vars中。我尝试使用 as.vectoras.arrayas.matrix等对对象类进行重塑,并没有成功。

#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参数,那么我应该得到此(次要(错误:

NLSMODEL中的错误(公式,MF,Start,wts,ups(: 初始参数估计的单数梯度矩阵

var替换工作静态代码时,我得到了:

nls中的错误(as.formula(粘贴(paste(" actight〜phend*(( "数据"中没有启动值的参数:e

我已经在静态版本中放置了一些明智的启动值,以处理这个人为的示例的第一个错误,但它仍然将其抛出。就这样吧。那不是我的关心。

start需要为名称列表。因此

start = setNames(as.list(vars$start), vars$var)

似乎要做您想要的(以vars$start中的值向量,将其转换为列表,并使用vars$var的相应元素作为其名称(。

对于它的价值,看起来您可以使用lm(impact/spend ~ ., data=input) ...

适合此特定型号

最新更新