【问题标题】:Getting error "'to' must be a finite number" Plotting a function for adstock获取错误“'to' must be afinite number” 为 adstock 绘制函数
【发布时间】:2021-07-09 16:04:09
【问题描述】:

请在下面查看我的 Rcode 和数据

channelName = as.character(myData$TV_total[1])
maxX = 1.05*max(myData$TV_total)
maxY = 1.05*max(myData$Total)



myPlotDataDF = data.frame(Return = myData$Total, Spend = myData$TV_total)


simpleScatterPlot <- ggplot(myPlotDataDF, aes(x = Spend, y = Return)) +
  geom_point(color="black") +
  theme(panel.background = element_rect(fill = 'grey85'),
        panel.grid.major = element_line(colour = "white")) +
  coord_cartesian(ylim = c(0,maxY), xlim = c(0,maxX)) +
  scale_x_continuous(labels = dollar) +
  scale_y_continuous(labels = comma) + 
  ggtitle(paste(channelName))

simpleScatterPlot 

girafe(ggobj = simpleScatterPlot)


Ufun<-function(x, Spend, Return) {
  predictedReturn = x[2] + (x[1] - x[2])*((Spend^x[3])/(x[4] + (Spend^x[3])))
  errorSq = (predictedReturn - Return)^2
  sumSqError = sum(errorSq)
  return(sumSqError)
}


startValVec = c(25000,100,1.5,100000)
minValVec = c(0,0,1.01,1)
maxValVec = c(500000, 500000, 2, 100000)


optim.parms<-nlminb(objective=Ufun,start=startValVec,
                    lower=minValVec,
                    upper=maxValVec,
                    control=list(iter.max=100000,eval.max=2000),
                    Spend = myData$Spend,
                    Return = myData$Return)

optim.parms

a = optim.parms$par[1]
b = optim.parms$par[2]
c = optim.parms$par[3]
d = optim.parms$par[4]

curveDFx = seq(from=0, to=max(myData$Spend)*2, length.out=10000)
curveDFy = b+(a-b)*((curveDFx^c)/(d+(curveDFx^c)))
curveDF = data.frame(Spend = curveDFx, Return = curveDFy)

然后抛出错误

seq.default 中的错误(从 = 1,到 = max(myData$Spend) * 2,length.out = 10000): 'to' 必须是有限数 另外:警告信息: 在 max(myData$Spend) 中:max 没有非缺失参数;返回 -Inf

【问题讨论】:

  • 请通过添加数据(而不是图像)使这个问题可重现。
  • 数据已上传。谢谢!

标签: r ggplot2 geom-point


【解决方案1】:

仅查看您的错误消息(无法访问数据),您似乎有NAmyData$Spend 中的缺失值。如果是这种情况,那么 max(...) 将返回 NA 而不是最大值。举个例子:

> x <- c(1:10, 30, 515, 2:18)
> max(x)

[1] 515

如果我们将NA 值添加到向量中,我们将得到NA

> y <- c(1:10, 30, 515, 2:18, NA)
> max(y)

[1] NA

如果您可以通过设置na.rm = TRUE 告诉max() 忽略任何缺失值,并且它会起作用:

> max(y, na.rm=TRUE)

[1] 515

所以,我猜设置 na.rm=TRUE 应该可以解决您在这一行中的问题:

curveDFx = seq(from=0, to=max(myData$Spend, na.rm=TRUE)*2, length.out=10000)

编辑:

刚刚注意到 OP 的错误消息是Error inn max(myData$Spend) : no non-missing arguments to max; returning -Inf。返回-Inf 将在您引用的向量长度为​​零时发生。换句话说,一个空向量。这意味着这里可能的解释是您正在引用数据框中不存在的列。可能是拼写错误或拼写错误最有可能导致此错误。

例子:

> df <- data.frame(x=1:10, y=1:10)
[1] 10
> max(df$Y)
[1] -Inf
Warning message:
In max(df$Y) : no non-missing arguments to max; returning -Inf

在这种情况下,我猜Spend 不包含在myData 中命名的列中。可能是笔误?

【讨论】:

  • 感谢您的回复。我会试一试。但是,如果您想挖掘数据。它现在在那里。干杯!
  • 作为一般预防措施,大多数人不会单击链接来获取数据(包括我)。尝试先运行max(myData$Spend),看看你是否真的得到一个数字值或NA。根据您的错误消息,关键肯定是那个。
  • 明白!我无法找到一种将数据附加到那里的方法。如果你能引导我走向正确的方式,我可以将它附加到主代码中。道歉!
  • 所以我尝试只运行“max(myData$Spend)”及其返回的“-Inf”和一条警告消息:在 max(myData$Spend) 中:max 没有非缺失参数;返回 -Inf
  • 此错误是由于 max() 被应用于不包含任何内容的向量(空向量)。您可能引用了myData 中不存在的列。你确定你的拼写正确吗?是myData$spend 而不是myData$Spend?如果你输入myData$Spend,你什么都得不到,还是有一个数字列表?
猜你喜欢
  • 2019-09-30
  • 2023-03-06
  • 1970-01-01
  • 2022-11-16
  • 2021-02-05
  • 2021-07-26
  • 1970-01-01
  • 2021-07-11
  • 2020-07-24
相关资源
最近更新 更多