patsy中的Python自然样条函数cr只接受3个或更多自由度,而R中的ns接受2个自由度

eqoofvh9  于 2023-03-10  发布在  Python
关注(0)|答案(1)|浏览(263)

我正在尝试将此功能移植到python中

> x <- 0:10
> y <- x**2
> lm(y ~ ns(x,df=2))

例如:

import numpy as np
import pandas as pd
import statsmodels.formula.api as smf

x = pd.DataFrame(np.arange(11))
y = x**2
formula="y ~ cr(x, df = 3)"

reg = smf.ols(formula,data=x).fit()
print(res.summary())

然而,在这个python公式中,我不能设置df〈3。有什么建议吗?我如何在python中拥有一个具有两个自由度的自然样条,并在patsy中将其作为一个R型方程使用?

ee7vknir

ee7vknir1#

这些显然产生了不同的基础:我不知道有什么不同,但下面的探索可能会有所帮助。
注意,cr模拟mgcv的基本结构(参见here;除了Simon Wood书之外,还讨论了here),而ns()是基于B样条构建的自然样条。我相信splines::bs()patsy.bs会完美匹配,但不存在patsy.ns

x <- 0:10
X1 <- model.matrix(~splines::ns(x, df = 3))
matplot(x, X1, type = "l")

import numpy as np
import pandas as pd
import patsy
import matplotlib.pyplot as plt
x = np.arange(11)
X2 = patsy.dmatrix(
        'cr(x, df = 3)',
        {'x': x}, return_type='dataframe')
plt.plot(X2)

相关问题