创建一个分段平滑函数,保留数据中的局部积分
Create a piecewise smooth function which preserves local integrals from data
我是一名正在写论文的社会学博士生。在一些数据分析过程中,我遇到了以下问题。
我有一个 table 一些变量在一系列年份中的测量值。值很重要,"how many events of a certain type there are in a given year"? 下面是它的示例:
year var
1983 22
1984 55
1985 34
1986 29
1987 15
1988 20
1989 41
所以,例如1984年,全年共发生55起。
在 [1983、1990) 的实数域上表示此数据的一种方法是使用分段函数 f
:
f(x) = var if floor(x) == year, for all x in [1983, 1990).
此函数绘制一系列宽度为 1 的水平线,绘制变量的条形图。每条线下的面积等于当年的变量值。但是,对于这个变量,我知道每年的比率在全年都不是恒定的。换句话说,事件不会在 12 月 31 日一夜之间突然从一个年率跳到另一个年率,因为(不连续)函数 f
似乎呈现。我不确切知道汇率如何变化,但我想假设年复一年地平稳过渡。
所以,我想要的是一个函数 g
,它在域 [1983, 1990] 上既连续又平滑(连续可微),它还保留了每年的总数。 即g
从1984年到1985年的定积分一定还是55,其他年份都一样。 (因此,例如,击中条形图所有中点的 n 次多项式将不起作用。)此外,我希望 g
成为分段函数,所有部分都相对简单 - 二次最好,或正弦曲线。
总之:我希望 g
是每年定义的一系列抛物线,从一个抛物线平滑地过渡到另一个(g'(x)
的左右极限应该在年边界),并且每个抛物线下的面积等于我上面的数据给出的总数。
I've drawn a crude version of what I want here. 漫画使用了和上面相同的数据,黑色曲线代表我希望的函数,g
。朝着正确的方向发展,事情变得特别糟糕,尤其是 1988 年和 1989 年。但这只是为了展示我希望最终得到的画面。
感谢您的帮助,或向我指出您认为可能有用的其他资源!
PS 我看过 this paper which is linked inside this question. 我同意作者的观点(见第 4 节),如果我可以使用矩阵 A 将我的数据替换为伪数据 d',我可以从中非常简单地生成某种平滑函数,那会很棒,但他们没有说明如何获得 A。只是一些值得思考的东西。再次感谢!
PPS 我需要的是一种生成 g 的可靠方法,给定任何数据 table 如上所述。我实际上有数百种此类年度统计数据,因此我需要一个通用的解决方案。
如果您的目标是将离散数据转换为连续表示,我建议查找 Kernel Density Estimation. KDE essentially models each data point as a (usually) Gaussian distribution and sums up the distribution, resulting in a smooth continuous distribution. This blog 使用 SciPy 模块对 KDE 进行了非常彻底的处理。
KDE 的缺点之一是它不提供解析解决方案。如果那是您的目标,我建议您查找 polynomial regression.
您需要对曲线进行积分才能通过由累积总数定义的一组特定点,因此...
在累计总数之间插值得到积分曲线,然后
取它的导数得到你要找的函数。
因为你希望你的函数是 "continuous and smooth",即 C1-连续的,你插值的积分曲线需要是 C2-连续的,即它必须有连续的一阶和二阶导数。可以使用多项式插值、sinc插值、足够次数的样条等
使用 "natural" 三次样条插值积分会给你一个 piece-wise 似乎满足你所有要求的二次导数。
这里对自然三次样条有很好的描述:http://mathworld.wolfram.com/CubicSpline.html
我是一名正在写论文的社会学博士生。在一些数据分析过程中,我遇到了以下问题。
我有一个 table 一些变量在一系列年份中的测量值。值很重要,"how many events of a certain type there are in a given year"? 下面是它的示例:
year var
1983 22
1984 55
1985 34
1986 29
1987 15
1988 20
1989 41
所以,例如1984年,全年共发生55起。
在 [1983、1990) 的实数域上表示此数据的一种方法是使用分段函数 f
:
f(x) = var if floor(x) == year, for all x in [1983, 1990).
此函数绘制一系列宽度为 1 的水平线,绘制变量的条形图。每条线下的面积等于当年的变量值。但是,对于这个变量,我知道每年的比率在全年都不是恒定的。换句话说,事件不会在 12 月 31 日一夜之间突然从一个年率跳到另一个年率,因为(不连续)函数 f
似乎呈现。我不确切知道汇率如何变化,但我想假设年复一年地平稳过渡。
所以,我想要的是一个函数 g
,它在域 [1983, 1990] 上既连续又平滑(连续可微),它还保留了每年的总数。 即g
从1984年到1985年的定积分一定还是55,其他年份都一样。 (因此,例如,击中条形图所有中点的 n 次多项式将不起作用。)此外,我希望 g
成为分段函数,所有部分都相对简单 - 二次最好,或正弦曲线。
总之:我希望 g
是每年定义的一系列抛物线,从一个抛物线平滑地过渡到另一个(g'(x)
的左右极限应该在年边界),并且每个抛物线下的面积等于我上面的数据给出的总数。
I've drawn a crude version of what I want here. 漫画使用了和上面相同的数据,黑色曲线代表我希望的函数,g
。朝着正确的方向发展,事情变得特别糟糕,尤其是 1988 年和 1989 年。但这只是为了展示我希望最终得到的画面。
感谢您的帮助,或向我指出您认为可能有用的其他资源!
PS 我看过 this paper which is linked inside this question. 我同意作者的观点(见第 4 节),如果我可以使用矩阵 A 将我的数据替换为伪数据 d',我可以从中非常简单地生成某种平滑函数,那会很棒,但他们没有说明如何获得 A。只是一些值得思考的东西。再次感谢!
PPS 我需要的是一种生成 g 的可靠方法,给定任何数据 table 如上所述。我实际上有数百种此类年度统计数据,因此我需要一个通用的解决方案。
如果您的目标是将离散数据转换为连续表示,我建议查找 Kernel Density Estimation. KDE essentially models each data point as a (usually) Gaussian distribution and sums up the distribution, resulting in a smooth continuous distribution. This blog 使用 SciPy 模块对 KDE 进行了非常彻底的处理。
KDE 的缺点之一是它不提供解析解决方案。如果那是您的目标,我建议您查找 polynomial regression.
您需要对曲线进行积分才能通过由累积总数定义的一组特定点,因此...
在累计总数之间插值得到积分曲线,然后 取它的导数得到你要找的函数。
因为你希望你的函数是 "continuous and smooth",即 C1-连续的,你插值的积分曲线需要是 C2-连续的,即它必须有连续的一阶和二阶导数。可以使用多项式插值、sinc插值、足够次数的样条等
使用 "natural" 三次样条插值积分会给你一个 piece-wise 似乎满足你所有要求的二次导数。
这里对自然三次样条有很好的描述:http://mathworld.wolfram.com/CubicSpline.html