Использование apply / sapply для определенной пользователем функции с несколькими параметрами - PullRequest
0 голосов
/ 24 сентября 2018

Для университетского проекта я программирую алгоритм дерева решений.Для этого я написал функцию для числовых переменных, которая определяет наилучшее разбиение.Эта функция работает правильно, когда я даю ей входные переменные.Выбор разбиения основан на индексе Джини.

gini.index <- function(input){
  l <- length(input)
  som <- sum(input)
  probability <- 1 - som/l
  gini <- probability * (1-probability)
  gini
}

impurity.reduction <- function(y, yl,yr){
  pi.l <- length(yl)/length(y)
  pi.r <- length(yr)/length(y)
  imp.red <- gini.index(y) - (pi.l * gini.index(yl) + pi.r * gini.index(yr))
  imp.red
}

best.split.point <- function(x,y){
  if (length(x) == length(y)){

    #bekijk mogelijke numerieke waarden om op te splitten
    x.sorted <- sort(unique(x))
    x.sorted.length <- length(x.sorted)
    splitpoints <- (x.sorted[1:(x.sorted.length-1)]+x.sorted[2:x.sorted.length])/2
    splitpoints

    #creer een lege vector om in de for loop alle impurity reduction waarden per split op te kunnen slaan
    puur <- vector()

    #bekijk voor ieder splitpoint wat de impurity reduction is
    for (i in 1:length(splitpoints)) {
      y1 <- y[x < splitpoints[i]]
      y2 <- y[x >= splitpoints[i]]
      puur <- c(puur,impurity.reduction(y,y1,y2))

    }
    splitpoints[puur == max(puur)]
  }
  else {
    return("Variables X & Y need to be of the same length")
  }
}

Когда я пытаюсь выполнить следующую команду, чтобы выяснить, как лучше разделить функциональность для каждого отдельного столбца в моем наборе данных, я получаю следующую ошибку:

sapply(credit.dat, best.split.point(credit.dat, y))
Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'Variables X & Y need to be of the same length' of mode 'function' was not found

В некоторых других сообщениях предполагается, что это может быть связано с наименованием моей функции (которую я уже изменил).Я думаю, что ошибка связана с составом моей функции, вероятно.Не мог бы кто-нибудь из вас помочь мне выяснить, из-за чего появляется эта ошибка?

Набор кредитных данных доступен здесь: http://www.cs.uu.nl/docs/vakken/mdm/credit.txt Переменная y является шестым столбцом набора кредитных данных, поэтому:

credit.dat <- read.csv("http://www.cs.uu.nl/docs/vakken/mdm/credit.txt")
y <- credit.dat[, 6]

1 Ответ

0 голосов
/ 25 сентября 2018

Так что работает:

credit.dat <- read.csv("http://www.cs.uu.nl/docs/vakken/mdm/credit.txt")
y <- credit.dat[, 6]

sapply(credit.dat, FUN=best.split.point, y=y)
# > sapply(credit.dat, best.split.point, y=y)
#     age married   house  income  gender   class 
#    32.5     0.5     0.5    36.0     0.5     0.5 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...