【问题标题】:How to use the lambda argument of smooth.spline in RPy WITHOUT Python interprating it as lambda如何在 RPy 中使用 smooth.spline 的 lambda 参数而不用 Python 将其解释为 lambda
【发布时间】:2020-02-02 22:42:44
【问题描述】:

我想在 Python 中使用来自 R 的自然三次平滑样条线 smooth.spline(就像许多其他人也想要的一样(Python natural smoothing splinesIs there a Python equivalent to the smooth.spline function in RPython 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 r rpy2 spline smoothing


    【解决方案1】:

    您可以在函数调用中使用 Python 的 **<dict> 来指定具有在 Python 中语法无效的名称的 R 命名参数。

    查看文档了解更多详情:https://rpy2.github.io/doc/v3.2.x/html/robjects_functions.html

    【讨论】:

    • 代码示例?当我使用**<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) 不起作用...
    • 查看文档。代码示例在那里。
    • stackoverflow.com/a/58240214/7735095 添加了一个不错的代码示例。我认为这与您的文档相对应。
    • 在我之后输入的两个答案都在文档中;-)
    【解决方案2】:

    也许你可以在调用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)
    

    【讨论】:

    【解决方案3】:

    这个小技巧可以解决您遇到的特定问题,允许您在字符串中写入“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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 2017-08-09
      • 2015-10-19
      相关资源
      最近更新 更多