R中沿“S”曲线的加权点

时间:2018-04-21 17:53:47

标签: r

我在R数据框中有数据,并希望沿着S曲线(logit曲线)加权一列(days_since)。特别地,向后S曲线使得更近期的事件将被加权更多。我使用这条曲线作为加权函数的原因在于它会对最近的事件以及轻微的重量远距离事件进行大量加权。因此,我想编写一个函数,对于给定数量的观察,我可以创建一个提供权重的S曲线,如下图所示,权重将在y轴上,并且自那以后的天数将是在x轴上。

[请忽略此图表上的点和标签,我能够使用另一个stackoverflow问题中反向s曲线/ logit函数的模型]。

enter image description here

1 个答案:

答案 0 :(得分:0)

这建立在对类似问题 [此处][https://stackoverflow.com/questions/41659903/retrieve-x-and-y-value-based-on-graph-in-r] 的回答之上。

您可以使用自己的公式或 e1071 包中的 sigmoid 函数和 curve() 函数创建曲线。然后,预测数据集中给定天数沿曲线的值。

这是一个简单的例子。

library(scales)
library(e1071)

# Data set with points of interest. Suppose these are days. 
days <- data.frame( d = seq.int( 1, 365, 1 ) )

curve() 函数将为您的 S 曲线创建 x 和 y 坐标。

p <- invisible(curve(-sigmoid(x) , -6,6))

重新调整 x 和 y 以确保范围包含您感兴趣的数据值。您将希望能够稍后从 x 预测 y。将 y 重新调整到上限和下限将为您的权重设置上限和下限。

x <- rescale(p$x, to = c(1, 365))
y <- rescale(p$y, to = c(0,1))

接下来,为您感兴趣的数据预测曲线上的值。在此示例中,天数从 1 到 365。您将 loess() 函数提供给 predict()loess() 函数将拟合曲线表面(将跨度设置为 0.1 将最小化任何平滑)。

days$pred <- predict( loess( y ~ x, span=.1 ), days$d ) 

plot(days$d,days$pred)

您的权重现在以 days$pred 为单位。