Ошибка в UseMethod («предикат»): нет применимого метода для «предиката», примененного к объекту класса «c (« double »,« numeric ») - PullRequest
0 голосов
/ 28 февраля 2019

Я не эксперт по 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)

Ошибка возникает.Что случилось?Многие тнх

1 Ответ

0 голосов
/ 28 февраля 2019

Я думаю, что нашел это.Кажется, это работает, но не уверен, что это то, что вы ожидаете.В 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)
...