【问题标题】:How can I dynamically populate start values in nls?如何在 nls 中动态填充起始值?
【发布时间】:2019-05-07 00:05:19
【问题描述】:

我正在向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、upper): 初始参数估计处的奇异梯度矩阵

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

nls 中的错误(as.formula(paste(paste("影响 ~ 花费*(", paste(paste(vars[, : “数据”中没有起始值的参数:e

我已经在静态版本中放置了一些合理的起始值来处理这个人为示例的第一个错误,但它仍然抛出它。随它吧。这不是我关心的问题。

【问题讨论】:

    标签: r dynamic nls


    【解决方案1】:

    start 需要是一个命名列表。因此

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

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

    对于它的价值,看起来你可以用lm(impact/spend ~ ., data=input) 来适应这个特定的模型......

    【讨论】:

    • 太棒了!谢谢,本博尔克。这是一个用于说明的虚拟方程式,但是是的,我实际上开始使用 gam。不过,我太密集了,无法弄清楚如何约束参数,所以我使用“端口”算法切换到 nls。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多