在 R 中创建绑定指数列
Create a Bound Exponential Column in R
如何在 2022 年和 2040 年之间的数据框中创建一个指数百分比列,该列受范围 1% 和 x% 的约束,我可以在其中设置指数方程的 "peak"?
在下面的预期结果table中,百分比开始增加1%,然后是2%...然后"peaks"以5%的增长率在25%-35%之间,然后下降回 2-3% 的增长率。
这是我想要完成的示例:
示例结果
end_growth_rate <- 48
2022 1%
2023 2%
2024 3%
2025 4%
2026 6%
2027 8%
2028 10%
2029 12%
2030 15%
2031 18%
2032 21%
2033 25%
2034 30%
2035 35%
2036 39%
2037 42%
2038 44%
2039 46%
2040 48%
非常感谢您的帮助!非常感激!如果需要任何澄清,我们很乐意解释更多。
您将某些内容放入 data.table
或 data.frame
的事实似乎并不重要。您所要求的只是开始、结束和曲线类型的函数。这可能是 sigmoid function(又名 "logistic function")。
试试这个:
mysigmoid <- function(n, min, max, maxe = 4, mine = -maxe) {
y <- 1 / (1 + exp(-seq(mine, maxe, len = max(0, n))))
min + (max - min) * (y - y[1]) / (y[n] - y[1])
}
您需要使用两个指数端点(maxe
和 mine
,它们对应于指数方程中使用的 left/right x
值在上面的 sigmoid link 中)以获得完美的传播。使用“-3 到 2”,我能够得到 "starting with 1%, ending with 1.9%",这似乎接近您传达的意图。
round(mysigmoid(19, 1, 49, 2, -3), 1)
# [1] 1.0 1.8 2.9 4.2 5.8 7.9 10.3 13.1 16.4 20.0 23.9 27.9 31.8 35.6 39.1
# [16] 42.2 44.9 47.1 49.0
round(diff(mysigmoid(19, 1, 49, 2, -3)), 1)
# [1] 0.8 1.0 1.3 1.6 2.0 2.4 2.9 3.3 3.6 3.9 4.0 4.0 3.8 3.5 3.1 2.7 2.3 1.9
(然后将它们分配给您选择的框架或 table 列。)
如何在 2022 年和 2040 年之间的数据框中创建一个指数百分比列,该列受范围 1% 和 x% 的约束,我可以在其中设置指数方程的 "peak"?
在下面的预期结果table中,百分比开始增加1%,然后是2%...然后"peaks"以5%的增长率在25%-35%之间,然后下降回 2-3% 的增长率。
这是我想要完成的示例:
示例结果
end_growth_rate <- 48
2022 1%
2023 2%
2024 3%
2025 4%
2026 6%
2027 8%
2028 10%
2029 12%
2030 15%
2031 18%
2032 21%
2033 25%
2034 30%
2035 35%
2036 39%
2037 42%
2038 44%
2039 46%
2040 48%
非常感谢您的帮助!非常感激!如果需要任何澄清,我们很乐意解释更多。
您将某些内容放入 data.table
或 data.frame
的事实似乎并不重要。您所要求的只是开始、结束和曲线类型的函数。这可能是 sigmoid function(又名 "logistic function")。
试试这个:
mysigmoid <- function(n, min, max, maxe = 4, mine = -maxe) {
y <- 1 / (1 + exp(-seq(mine, maxe, len = max(0, n))))
min + (max - min) * (y - y[1]) / (y[n] - y[1])
}
您需要使用两个指数端点(maxe
和 mine
,它们对应于指数方程中使用的 left/right x
值在上面的 sigmoid link 中)以获得完美的传播。使用“-3 到 2”,我能够得到 "starting with 1%, ending with 1.9%",这似乎接近您传达的意图。
round(mysigmoid(19, 1, 49, 2, -3), 1)
# [1] 1.0 1.8 2.9 4.2 5.8 7.9 10.3 13.1 16.4 20.0 23.9 27.9 31.8 35.6 39.1
# [16] 42.2 44.9 47.1 49.0
round(diff(mysigmoid(19, 1, 49, 2, -3)), 1)
# [1] 0.8 1.0 1.3 1.6 2.0 2.4 2.9 3.3 3.6 3.9 4.0 4.0 3.8 3.5 3.1 2.7 2.3 1.9
(然后将它们分配给您选择的框架或 table 列。)