【问题标题】:Error in UseMethod("predict") : no applicable method for 'predict' applied to an object of class "c('double', 'numeric')UseMethod("predict") 中的错误:没有适用于 'predict' 的方法应用于类“c('double', 'numeric') 的对象
【发布时间】:2019-07-22 10:33:03
【问题描述】:

我不是 R 专家。我正在尝试计算多项式模型产生的偏差:

f <- function(x) sin(x-5)/(x-5)
# From which we can sample datasets:
N <- 20
x <- runif(N,0,15)              
t <- f(x) + rnorm(N, sd=0.1)  

t 是生成数据的函数,我使用标准差为 0.2 的高斯误差同步函数。 要创建点 x,我使用 0 到 15 的均匀分布形式。

plot.bias <- function (f, polydeg) {
   plot(data.frame(x, t))
   curve(f, type="l", col="green", add=TRUE)
   polyfit <- lm(t ~ poly(x, polydeg, raw=TRUE))
   p <- polynom(coef(polyfit))
   curve(p, col="red", add=TRUE)
   points(x, calc.bias(f, polydeg, x), col="blue")
   abline(h=0, col='blue')
}

这个函数首先绘制数据,然后绘制原始生成曲线,然后计算给定次数的回归多项式,绘制它,最后绘制偏差。偏差由以下给出误差的函数计算:

calc.bias <- function (f, polyfit, point) {
  predictions <- numeric(0)
  print(class(point))
  for (i in 1:100)
  {
     x <- runif(N, 0, 15)                 
     t <- f(x) + rnorm(N, sd=0.2)
     d <- data.frame(point)
     add <- predict(polyfit, newdata = data.frame(point))
     predictions <- c(predictions, add)
  }
  return((f(point)-mean(predictions))^2)
}

我所做的是使用我们的多项式模型计算最佳预测(f 函数)减去 100 个不同数据集中给定点的预测的差值。我将这些结果存储在预测向量中,最后该函数返回差值均值的平方,即平方偏差。

奇怪的是,当我执行纯代码而不是函数时,它可以工作,它不会产生任何错误。但是当我运行时:

plot.bias(f, 1)

出现错误。怎么了?很多tnx

【问题讨论】:

  • 你用的是什么包?
  • 在函数predict 中使用变量polydeg,即1。但是,在predict 中,第一个参数需要是需要预测的模型对象。例如来自lm 的模型。

标签: r machine-learning statistics regression prediction


【解决方案1】:

我想我找到了。这似乎有效,但不确定它是否符合您的期望。在plot.bias 中,我更改了您对calc.bias 的使用(即calc.bias(f, polyfit, x) 而不是calc.bias(f, polydeg, x))。我使用的整个代码:

library(PolynomF)

f <- function(x) sin(x-5)/(x-5)
# From which we can sample datasets:
N <- 20
x <- runif(N,0,15)              
t <- f(x) + rnorm(N, sd=0.1)  



calc.bias <- function (f, polyfit, point) {
  predictions <- numeric(0)
  print(class(point))
  for (i in 1:100)
  {
    x <- runif(N, 0, 15)                 
    t <- f(x) + rnorm(N, sd=0.2)
    d <- data.frame(point)
    add <- predict(polyfit, newdata = data.frame(point))
    predictions <- c(predictions, add)
  }
  return((f(point)-mean(predictions))^2)
}

plot.bias <- function (f, polydeg) {
  plot(data.frame(x, t))
  curve(f, type="l", col="green", add=TRUE)
  polyfit <- lm(t ~ poly(x, polydeg, raw=TRUE))
  p <- polynom(coef(polyfit))
  curve(p, col="red", add=TRUE)
  points(x, calc.bias(f, polyfit, x), col="blue")
  abline(h=0, col='blue')
}

plot.bias(f, 1)

【讨论】:

  • 是的,现在它可以工作了,但正如你所指出的,这不是我所期望的。偏差不随多项式的次数而变化...
  • 我不确定您的calc.bias 是否正确。目前它计算了 100 次相同的预测,因为它使用了不会改变的point
猜你喜欢
  • 2019-06-20
  • 2021-07-21
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 2021-07-23
  • 2021-08-17
  • 2017-01-10
  • 1970-01-01
相关资源
最近更新 更多