如何用R语言curve()函数绘制参数a、b变化的logistic曲线
问题解决
报错原因
你遇到的报错来自两个核心问题:
- 公式书写错误:
- 标准logistic公式应为
y = exp(a + b*x) / (1 + exp(a + b*x)),你漏写了分母的括号,逻辑变成了exp(.)/1 + exp(.),完全不符合公式定义 - R语言不支持隐式乘法,
bx必须写为b*x
- 标准logistic公式应为
- 表达式内的
a、b变量未提前赋值,R无法识别变量来源
基础R curve() 实现方案
图1:固定b,展示不同a的曲线变化
# 固定b值,设定要测试的a的取值序列 b_fixed <- 1 a_list <- c(-4, -2, 0, 2, 4) color_list <- c("red", "orange", "green", "blue", "purple") # 先画第一条曲线 curve(expr = exp(a_list[1] + b_fixed * x) / (1 + exp(a_list[1] + b_fixed * x)), from = -10, to = 10, n = 101, col = color_list[1], lwd = 2, xlab = "x", ylab = "y", main = "Logistic曲线随a的变化(固定b=1)") # 循环添加剩余a值对应的曲线 for (i in 2:length(a_list)) { curve(expr = exp(a_list[i] + b_fixed * x) / (1 + exp(a_list[i] + b_fixed * x)), from = -10, to = 10, n = 101, col = color_list[i], lwd = 2, add = TRUE) } # 添加图例 legend("topleft", legend = paste0("a=", a_list), col = color_list, lwd = 2)
图2:固定a,展示不同b的曲线变化
# 固定a值,设定要测试的b的取值序列 a_fixed <- 0 b_list <- c(-2, -1, 0, 1, 2) color_list <- c("red", "orange", "green", "blue", "purple") # 先画第一条曲线 curve(expr = exp(a_fixed + b_list[1] * x) / (1 + exp(a_fixed + b_list[1] * x)), from = -10, to = 10, n = 101, col = color_list[1], lwd = 2, xlab = "x", ylab = "y", main = "Logistic曲线随b的变化(固定a=0)") # 循环添加剩余b值对应的曲线 for (i in 2:length(b_list)) { curve(expr = exp(a_fixed + b_list[i] * x) / (1 + exp(a_fixed + b_list[i] * x)), from = -10, to = 10, n = 101, col = color_list[i], lwd = 2, add = TRUE) } # 添加图例 legend("topleft", legend = paste0("b=", b_list), col = color_list, lwd = 2)
ggplot2 geom_function() 实现方案(更美观,图例自动生成)
图1:不同a值的曲线对比
library(ggplot2) b_fixed <- 1 a_list <- c(-4, -2, 0, 2, 4) ggplot(data.frame(x = c(-10, 10)), aes(x = x)) + lapply(1:length(a_list), function(i) { geom_function(fun = function(x) {exp(a_list[i] + b_fixed*x)/(1 + exp(a_list[i] + b_fixed*x))}, aes(color = as.factor(a_list[i])), linewidth = 1) }) + labs(color = "a取值", x = "x", y = "y", title = "Logistic曲线随a的变化(固定b=1)") + theme_minimal()
图2:不同b值的曲线对比
library(ggplot2) a_fixed <- 0 b_list <- c(-2, -1, 0, 1, 2) ggplot(data.frame(x = c(-10, 10)), aes(x = x)) + lapply(1:length(b_list), function(i) { geom_function(fun = function(x) {exp(a_fixed + b_list[i]*x)/(1 + exp(a_fixed + b_list[i]*x))}, aes(color = as.factor(b_list[i])), linewidth = 1) }) + labs(color = "b取值", x = "x", y = "y", title = "Logistic曲线随b的变化(固定a=0)") + theme_minimal()
内容的提问来源于stack exchange,提问作者Alison Meeth
相关产品推荐
相关产品推荐

