Как использовать лямбда-аргумент smooth.spline в RPy БЕЗ Python, интерпретируя его как лямбда - PullRequest
2 голосов
/ 04 октября 2019

Я хочу использовать естественные кубические сплайны сглаживания smooth.spline от R в Python (как и многие другие тоже хотят ( Python естественные сглаживающие сплайны , Есть ли Python, эквивалентный гладкому.spline функция в R , Python SciPy UnivariateSpline против 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 напрямую.

Ответы [ 3 ]

3 голосов
/ 04 октября 2019

Возможно, вы могли бы использовать rpy2 ' Function.rcall () метод при вызове smooth.spline?

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)
3 голосов
/ 04 октября 2019

Этот небольшой трюк поможет обойти конкретную проблему, позволяя вам написать «лямбду» в строке.

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)
1 голос
/ 04 октября 2019

Вы можете использовать Python **<dict> в вызове функции, чтобы указать R именованных аргументов, имя которых не является синтаксически допустимым в Python.

Подробнее см. В документации: https://rpy2.github.io/doc/v3.2.x/html/robjects_functions.html

...