如何在 RPy 中使用 smooth.spline 的 lambda 参数而不 Python 将其解释为 lambda
How to use the lambda argument of smooth.spline in RPy WITHOUT Python interprating it as lambda
我想在 Python 中使用 R 中的自然三次平滑样条 smooth.spline
(就像许多其他人想要的一样(Python natural smoothing splines, Is there a Python equivalent to the smooth.spline function in R, 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
。
您可以在函数调用中使用 Python 的 **<dict>
来指定 R 命名参数,这些参数的名称在 Python 中在句法上无效。
有关详细信息,请参阅文档:https://rpy2.github.io/doc/v3.2.x/html/robjects_functions.html
也许您可以在调用 smooth.spline
时使用 rpy2
的 Function.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)
这个小技巧可以解决您遇到的具体问题,方法是让您在字符串中写入 "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)
我想在 Python 中使用 R 中的自然三次平滑样条 smooth.spline
(就像许多其他人想要的一样(Python natural smoothing splines, Is there a Python equivalent to the smooth.spline function in R, 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
。
您可以在函数调用中使用 Python 的 **<dict>
来指定 R 命名参数,这些参数的名称在 Python 中在句法上无效。
有关详细信息,请参阅文档:https://rpy2.github.io/doc/v3.2.x/html/robjects_functions.html
也许您可以在调用 smooth.spline
时使用 rpy2
的 Function.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)
这个小技巧可以解决您遇到的具体问题,方法是让您在字符串中写入 "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)