Python 中相当于 Stata 的 mkspline 的是什么?

问题描述 投票:0回答:2

在 Stata 中,

mkspline
会自动创建包含给定一系列节点值的线性样条的变量...

mkspline knot1 30 knot2 40 knot3 50 knot4 = v1

这是在 Stata 中对一系列值运行的结果。它基本上将值分布在样条结上。抱歉,我不知道这方面的技术数学或统计术语,只知道整体概念。

v1  knot1  knot2  knot3  knot4
10     10      0      0      0
20     20      0      0      0
30     30      0      0      0
40     30     10      0      0
50     30     10     10      0
60     30     10     10     10
70     30     10     10     20
80     30     10     10     30
90     30     10     10     40
100    30     10     10     50

Python 中是否有与 Numpy 或 Pandas 或类似工具等效的函数?

python pandas numpy stata
2个回答
0
投票

我最近遇到了这个问题,这是示例代码,我使用 mkspline 文档来生成,然后进行测试并能够在 python 中重现 stata 样条线。主要要点是 mkspline 直到结点为止都是线性的,称为受限三次样条。例如)

stata: mkspline mileage (100, 600, 3000, 5000, 10000)

蟒蛇:

def rcs(x, knots)

    df_splines = pd.DataFrame()
    df_splines[f'spline_1'] = x.copy()

    k_1 = knots[0]
    k-n = knots[-1]

   def d(x,k): return ((x-k)**3)*(x>k).  

   for i in range(1,len(knots)):
        knot_i = knots[i-1]
        temp_col=d(x, knot_i)

        if i<len(knots)
             next_k=knots[i]
             temp_col -= ((d(x,k_n)-d(x,next_k))*(k_n-next_k))/((k_n-k_1)*(k_n-knot_i))
        df_splines[f'spline_{i+1}'] = temp_col / ((k_n -k_1)**2)

  return df_splines

#基于变量调用

mileage_splines = rcs(里程,节)

#将数组转换为 df 并添加回主数据帧以重现 stata 方法,删除最后一个样条线。


-1
投票

我认为没有这样的功能。


尝试使用 numpy:

thresh = [0,30,40,50]
diffs = np.maximum(df[['v1']].to_numpy() - thresh,0)
diffs[:,:-1] = np.minimum(diffs[:,:-1], [np.diff(thresh)])

输出:

array([[10,  0,  0,  0],
       [20,  0,  0,  0],
       [30,  0,  0,  0],
       [30, 10,  0,  0],
       [30, 10, 10,  0],
       [30, 10, 10, 10],
       [30, 10, 10, 20],
       [30, 10, 10, 30],
       [30, 10, 10, 40],
       [30, 10, 10, 50]])
© www.soinside.com 2019 - 2024. All rights reserved.