如何在RPy中使用smooth.spline的lambda参数,而不让Python将其解释为lambda。

5
我想在Python中使用来自R的自然三次平滑样条smooth.spline(就像许多其他人一样想要的一样(Python自然平滑样条Python是否有与R中的smooth.spline函数相当的Python等效函数Python SciPy UnivariateSpline vs R smooth.spline,...))。因此,我使用rpy2,如https://morioh.com/p/eb4151821dc4所述,但我想直接设置lambda而不是spar
import rpy2.robjects as robjects
r_y = robjects.FloatVector(y_train)
r_x = robjects.FloatVector(x_train)

r_smooth_spline = robjects.r['smooth.spline'] #extract R function# run smoothing function
spline1 = r_smooth_spline(x=r_x, y=r_y, lambda=42)
#alternative: spline1 = r_smooth_spline(x=r_x, y=r_y, spar=0.7) would work fine, but I would like to control lambda dirctly
ySpline=np.array(robjects.r['predict'](spline1,robjects.FloatVector(x_smooth)).rx2('y'))
plt.plot(x_smooth,ySpline)

当我执行这段代码时,spline1 = r_smooth_spline(x=r_x, y=r_y, lambda=42)不起作用,因为Python已经有一个预定义的lambda解释(你可以从lambda的蓝色代码高亮中看到这一点),我希望lambda被解释为平滑惩罚参数lambda。
如果我用spar替换lambda,那么得到的将是一个自然的三次样条函数,但我想直接控制lambda
3个回答

5
这个小技巧可以解决你遇到的问题,让你可以在字符串中写入“lambda”。
kwargs = {"x": r_x, "y": r_y, "lambda":  42}
spline1 = r_smooth_spline(**kwargs)

通常情况下,您可以使用元组和字典轻松传递参数容器。

# as normal
f = function("foo", "bar", my_kwarg="my_value")

# the same call using argument containers
args = ("foo", "bar")
kwargs = {"my_kwarg": "my_value"}
f = function(*args, **kwargs)

4
也许你可以在调用 smooth.spline 时使用 rpy2Function.rcall() 方法?
import rpy2.robjects as robjects
r_y = robjects.FloatVector(y_train)
r_x = robjects.FloatVector(x_train)

r_smooth_spline = robjects.r['smooth.spline']
args = (('x',r_x), ('y',r_y), ('lambda',42)) # pattern (('argname', value),...)

# import R's "GlobalEnv" to evaluate the function
from rpy2.robjects import globalenv

spline1 = r_smooth_spline.rcall(args, globalenv)

这是一个链接到过时文档的页面。您需要访问 https://rpy2.github.io/doc/v3.2.x/html/robjects_functions.html。 - lgautier

1

代码示例?当我使用**<dict>时,行spline1 = r_smooth_spline(x=r_x, y=r_y, lambda=42)会是什么样子? spline1 = r_smooth_spline(x=r_x, y=r_y, **<lambda>=42)不起作用... - Jakob
请查看文档。代码示例已在其中。 - lgautier
https://dev59.com/Arbna4cB1Zd3GeqPfrhP#58240214 添加了一个不错的代码示例。我认为这符合您的文档要求。 - Jakob
我的回答后面的两个答案都在文档中;-) - lgautier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接