【问题标题】:ksmooth function doesn't work with parameters via ellipsisksmooth 函数不能通过省略号处理参数
【发布时间】:2021-01-27 19:58:19
【问题描述】:

由于大学的课程,我目前正在使用 R,所以我仍然很缺乏经验。 我们使用 R 进行探索性数据分析。在数据分析中,我们应该对数据应用不同的回归模型并为每个模型生成相同的图。此外,出于学习目的,我们应该对参数进行一些操作。为了避免 10-20 次不吸引人的复制粘贴,我编写了一个函数,将回归函数及其参数显示为省略号 (...)。在这个函数中,我使用省略号作为参数调用传递的函数。

library("astsa")

data_glob <- globtemp


plot.data.and.reg <- function(data, reg.func, ...){
  model <- reg.func(...)

  par(mfrow = c(1, 2))
  plot(data)
  abline(model, col = "orange", lwd = 3)

  qqnorm(data)

}

这适用于简单的 lm 函数,但不幸的是不适用于 ksmooth 函数。 当我通过此函数时,我收到错误消息:“必须提供数字 y。对于密度估计,请使用密度()”。

plot.data.and.reg(
  data_g,
  lm,
  list(
    formula = as.formula("data_glob ~ time(data_glob)"),
    data = data_glob
  )
)


plot.data.and.reg(
  data_glob,
  ksmooth,
  list(
    x = as.numeric(time(data_glob)),
    y = as.numeric(data_glob),
    kernel = "box",
    bandwidth = 0.25
  )
)

于是我查看了source code of ksmooth。它表明出现此错误消息是因为检查“missing(y)”失败。显然出现了一个问题,因为我将参数作为省略号传递并且它似乎没有“解包”。 为简单起见,我编写了一个虚拟函数来测试我是否可以自己添加这个“解包”。

test.wrapper <- function(func, ...){
    func(...)
}

test <- function(x, y){
  match.call()

  if(missing(y))
    print("Leider hatte ich Recht")

  print(x)
  print(y)
}

test.wrapper(test, list(x = 10, y = 20))

很遗憾,我还没有找到解决方案。 我从 Python 知道这一点,因此与 kwargs 一样,可以使用 ** 运算符解压缩字典。 R中是否有等价物?或者如何确保在 R 中正确使用省略号中的参数?

由于它可以与 lm 函数一起使用而没有错误,因此我还再次查看了 their source code 。不幸的是,以我在 R 方面的一点经验,我无法确切地看出本质区别在哪里。

总的来说,我将错误归因于 ksmooth 函数尚未设计用于省略号的事实,但我不确定。我需要如何调整ksmooth 代码以使其与... 一起使用? (对于我的Uni任务,如果有疑问,我将求助于复制粘贴(反)模式。经过这么长时间的搜索,我仍然对解决方案感兴趣,并且将来可能会有用)。 非常感谢您的帮助!

标签: r


【解决方案1】:

*/** 在 Python 中最接近的等价物是 do.call 函数。

但是,这里不需要这个。实际问题是您将额外的参数作为 list 而不是单独传递。将列表展平后,它就可以工作了1

plot.data.and.reg(
  data_glob,
  ksmooth,
  x = as.numeric(time(data_glob)),
  y = as.numeric(data_glob),
  kernel = "box",
  bandwidth = 0.25
)

我真的很惊讶它lm 的列表一起工作;这不是故意的,本质上是lm目前的实现方式造成的意外。


1 我说它“有效”是因为没有错误并且它绘制了一些东西,但是对于您的示例数据,没有可见的回归线(abline 不适合ksmooth 的输出) ,并且平滑参数什么都不做——结果与未平滑的输入相同。

要使其正常工作,请使用 lines 而不是 abline。至于平滑,对于您的示例数据,带宽 10 可以正常工作。

【讨论】:

  • 康拉德您好,非常感谢您的帮助。根据您的建议,现在一切正常,我只需要添加一个 try(lines(.....)) 和 try(abline(.....)) 以便可以正确绘制两种形式的模型。还要感谢您提供函数名称的提示。在那里,我可能完全没有从 Python 中采用的错误习惯。 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多