【问题标题】:Find the ranges of minimal and maximal gradients on sigmoidal curve in R在R中的S形曲线上找到最小和最大梯度的范围
【发布时间】:2014-09-10 16:27:01
【问题描述】:

首先,这是我的第一个 Stack Overflow 问题,因此我为违规和礼节道歉。其次,我意识到这将是非常微不足道的,但我很难过。我试图弄清楚如何在 S 形曲线上找到最小和最大梯度。

我有一个函数可以生成一个由 y 值组成的向量,该向量形成一个 sigmoidal 曲线:

#function to generate Sigmoid curves - works better with enough Xs to be smooth
genSigmoid = function(a, b, c, theta){ 

    y = c + ((1-c) / (1 + exp(-a*(theta-b))))
    return(y)

}

x<-c(1:100)

y<-genSigmoid(.25, .50, 0, x)

plot(x, y, type="n")

lines(x, y)

我想做的是沿着这条曲线找到梯度最小或为零的点和梯度最大的点。我的最终目标是根据沿曲线的渐变强度,用不同的线条样式绘制这条曲线的不同部分。我可以通过“目测”来生成这些不同的样式,但如果有一些可以更精确地做到这一点的东西会很好。

【问题讨论】:

  • 仅供参考,这里不需要lines,只需plot(x, y, type="l")

标签: r gradient derivative


【解决方案1】:

您可以使用包numDeriv 中的grad(...) 函数来执行此操作。

genSigmoid = function(theta,pars){  
  y <- with(pars,c + ((1-c) / (1 + exp(-a*(theta-b)))))
  return(y)
}
x<-c(1:100)
pars <- list(a=0.25, b=0.50, c=0.0)
y<-genSigmoid(x, pars)
plot(x, y, type="l", ylim=c(0,1), col="blue")

library(numDeriv)
z<-grad(genSigmoid,x,pars=pars)
lines(x,z,col="red")

这里zgenSigmoid(...)theta 的导数的向量。

我重新定义了您的函数以使调用序列更简单(将参数组合到命名列表中,并颠倒参数的顺序)。

用不同的线型绘制曲线段有点棘手:

lt <- as.integer(3*(z-min(z))/diff(range(z))+1)
df <- data.frame(x,y,z,lt)
plot(x,y,type="n")
lapply(split(df,df$lt),function(df)with(df,lines(x,y,lty=lt)))

因此,这会根据导数的值创建一个线型(1、2、3 或 4)向量,然后根据线型拆分数据,并绘制线段。

【讨论】:

  • 比我早一秒...看来diff(y) 也能胜任这项工作
  • @DavidArenburg 是的,在 OP 的情况下,x 是等距的,并且函数表现良好。不过,它不是 S 形曲线。
  • 这太棒了。谢谢!对不起,如果我搞砸了术语。这是项目响应理论函数的方程,我只是假设它是 sigmoid。尽管如此,还是非常感谢你。我尝试了 grad() 函数,但无法让它工作 - 看起来你的解决方案好多了,好多了。谢谢!
  • 也感谢您清理我的功能。我刚刚进入 R 编程,所以还在学习所有的好技巧。谢谢!
猜你喜欢
  • 2016-02-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
相关资源
最近更新 更多