r - 如何在 R 的核密度图中找到拐点?
问题描述
我试图在我用 density() 函数计算的核密度图的曲线中找到拐点的 x 值。
我发现以下已回答的问题有助于找到转折点:
所以我认为也必须有一种方法来找到拐点的 x 值。如果有人有小费会很棒。
解决方案
根据定义,拐点是函数的二阶导数为零的点。在实践中,这意味着拐点将是斜率从增加变为减少的点,或者 vv 使用这个定义,我采用了这种近似且非自动的方法:假设您有一个数据框,我将调用all
,其中包含第一列中的 x 值,以及第二列中的密度计算结果。从这个数据框中,我们可以计算出两个连续点的斜率,如下所示:
slopes <- vector()
for(i in (2:nrow(all))){
x1 <- all[i-1, 1]
x2 <- all[i, 1]
y1 <- all[i-1, 2]
y2 <- all[i, 2]
slope_i <- (y2-y1)/(x2-x1)
slopes <- append(slopes, slope_i)
}
根据拐点的定义,我们现在可以计算从一个点到另一个点的斜率是变大还是变小:
increment <- vector()
for(j in 2:length(slopes)){
increment_j <- slopes[j] - slopes[j-1]
increment <- append(increment, increment_j)
}
拐点将是这个增量从正到负传递的那些点,或 vv
现在,让我们将这些增量分为正数和负数:
pos <- which(increment>0)
neg <- which(increment<0
现在,只要这些pos
或neg
向量中有跳跃,就意味着我们有一个拐点。所以,再一次:
steps_p <- vector()
for(k in 2:length(pos)){
steps_k <- pos[k] - pos[k-1]
steps_p <- append(steps_p, steps_k)
}
steps_n <- vector()
for(k in 2:length(neg)){
steps_k <- neg[k] - neg[k-1]
steps_n <- append(steps_n, steps_k)
}
现在,只要问 R:
which(steps_p>1)
which(steps_n>1)
这是您的拐点的索引,现在只需转到您的原始数据框并询问 x 值:
all[pos[which(steps_p>1)],1]
all[neg[which(steps_n>1)],1]
请记住,x 值将接近精确,但并不完全,因为在每个循环中我们都会丢失一个索引,但它仍然是一个非常接近的解决方案。
推荐阅读
- c# - 如何使用 Entity Framework 通过 ASP.NET Core Web API 处理通用查询?
- ios - 应用程序突然停止并收到 NSURLErrorDomain 错误
- powerbi-desktop - Power BI SQL 连接
- python - 如何在每第 n 行后读取 csv 文件并创建一个新的 csv 文件?
- excel - 如果没有输入值,则停止宏
- javascript - Javascript将对象值分配给另一个对象值
- python - 如何链接到 libssl.so.1.1 “./python:错误 libssl.so.1.1:无法打开共享对象文件:没有这样的文件或目录”
- php - 提交表单后codeigniter获取值
- javascript - 如何在 React Native Web 中访问引用的子组件?
- javascript - 通过子字符串 JavaScript 对数组元素进行分组