在 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 或类似工具等效的函数?
我最近遇到了这个问题,这是示例代码,我使用 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 方法,删除最后一个样条线。
我认为没有这样的功能。
尝试使用 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]])