如何在R中绘制带不同参数的收益递减Reach函数图像?
问题解决:重现收益递减的Reach函数图像
1. 修正Reach函数的R语法
你原代码里的函数有几个关键错误:
- R中没有
e^{}的写法,指数函数要用exp() - 分式必须加括号,否则运算顺序会完全错误
- 函数需要明确以
x作为自变量(因为curve()会自动把绘图范围内的x值传入函数)
假设你要实现的是收益递减的饱和增长Reach函数(最常见的形式,随着x增大,Reach趋近于最大值,增长速率逐渐放缓),正确的函数定义如下:
# 定义收益递减的Reach函数 # x: 自变量(比如投放量、时间) # mu: 转换参数(控制增长快慢,mu越大增长越快) # M: 最大Reach值(饱和上限,可根据需求调整) reach <- function(x, mu, M = 50) { M * (1 - exp(-mu * x)) }
如果你的原公式是分式形式(比如逻辑斯蒂变体),修正后的函数是:
reach <- function(x, mu, t = 1) { # t是固定参数,可根据视频里的设定修改 (1 - exp(-mu * x * t)) / (1 + exp(-mu * x * t)) }
2. 变量处理说明
x:不需要手动模拟,curve()会自动生成from到to之间的x序列作为自变量传入函数mu:你已经定义了要对比的参数向量c(1,3,5,7),直接传入函数即可t/M:属于固定参数,根据视频里的公式设定具体数值即可,不需要模拟
3. 完整绘图代码
以下是可直接运行的代码,用来重现不同mu参数下的Reach曲线:
# 定义Reach函数 reach <- function(x, mu, M = 50) { M * (1 - exp(-mu * x)) } # 设定要对比的mu参数 mu_values <- c(1, 3, 5, 7) # 设定曲线颜色 cols <- c("#E63946", "#457B9D", "#1D3557", "#A8DADC") # 绘制第一条曲线,初始化画布 curve(reach(x, mu = mu_values[1]), from = 0, to = 2, col = cols[1], ylim = c(0, 50), main = "收益递减的Reach函数(不同mu参数)", xlab = "自变量x(如投放量/时间)", ylab = "Reach值") # 循环添加剩余曲线 for(i in 2:length(mu_values)) { curve(reach(x, mu = mu_values[i]), from = 0, to = 2, col = cols[i], add = TRUE) } # 添加图例,方便区分不同参数 legend("bottomright", legend = paste0("mu = ", mu_values), col = cols, lty = 1)
关键错误修正点
- 原代码误用了
weibull()函数,应该调用你自己定义的reach()函数 curve()的add参数在第一次绘图时设为FALSE(默认),后续循环设为TRUE即可- 确保
ylim的范围符合函数的输出值(比如饱和增长函数的输出在0到M之间)
内容的提问来源于stack exchange,提问作者Nneka
相关产品推荐
相关产品推荐

