首页 > 解决方案 > 您如何获得与 R 中的 PDF 曲线相关的实际多项式函数?

问题描述

我正在学校做一个实验,我正在分析扭转风力涡轮机转子叶片对涡轮机输出功率的影响。

在我的实验中,我分别进行了 50 次观察,其中我将涡轮机的一个转子叶片弯曲了特定的量(以度为单位),然后监测了 2 分钟的平均功率输出。我的数据集看起来像这样

X1P_Train_Arrange <- data.frame(
  Mean = runif(250),
  Degree = sample(c("0", "1", "2", "3", "4","5"), 10, replace = TRUE)
)

然后,我使用 geom_density 函数为我在执行实验时弯曲转子叶片的每个度数创建 PDF 图表。

Mean_Density <- ggplot(X1P_Train_Arrange, aes(x = Mean, color = Degree)) + 
                geom_density(lwd = 2.0) +
                labs(title = "Mean", x = "Mean", y = "Density") +
                theme_minimal() + theme_Publication() 

现在,我的问题是,有没有办法在绘制数据时获得与每条彩色曲线相关的实际多项式函数?提前感谢您的任何帮助或帮助。

标签: rggplot2

解决方案


核密度估计不是多项式函数。

但是,如果您愿意,您可以重建实际功能。

请注意,KDE 只是以您的数据点为中心的许多高斯分布的总和,每个高斯分布具有算法选择的一些带宽。所以你只需要带宽,然后你就可以把它们放在一起。带宽只是构成 KDE 的高斯分布的标准差。更宽的带宽使曲线更平滑,但会导致特征丢失。太小,曲线太参差不齐。所以这是一个优化问题。

我怀疑ggplot您可以提供自己的带宽,但要获得一个,我认为最好的办法是首先使用该density功能适合您自己的带宽。一旦你这样做,你可以看到 的价值$bw。知道带宽后,您只需创建一个函数,该函数是许多以数据点为中心的正态密度函数的总和,每个函数的标准差为bw.

例如:

randomNumbers <- rnorm(100)
densityObject <- density(randomNumbers)

individualKernals <- lapply(randomNumbers, function(centerOfKernal){
  #return a function here, not a value
  function(x){dnorm(x, mean = centerOfKernal, sd = densityObject$bw)}
})

reproducedFunction <- function(x){
  toAverage <- sapply(individualKernals, function(f){f(x)})
  mean(toAverage)
}

plot(densityObject)

someXRange <- densityObject$x
y <- sapply(someXRange, reproducedFunction)

lines(x = someXRange, y = y, col = rgb(1,0,0,0.3), lwd = 3)

推荐阅读