R: значения 'x' идентичны, а значения лямбды слишком перераспределены в функции boxcoxnc - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь использовать функцию boxcoxnc в пакете AID для вычисления нормализованных данных с использованием статистики Shapiro-Wilcox W для определения лямбда-выражения.

Я хочу, чтобы функция boxcoxnc запускалась для каждого столбца в моем фрейме данных в цикле for.

data<-data.frame(data[,2:27])

for (f in 1:length(data)){
  model<-boxcoxnc(as.matrix(as.numeric(unlist(data[f]))),
                  method="sw",lambda = as.numeric(seq(-20,20,0.01)))
}

Первые три столбца работают нормально, а когда я попадаю в четвертый, я получаю ошибку:

Error in boxcoxnc(as.matrix(as.numeric(unlist(data[f]))), method = "sw",  : 
  Enlarge the range of the lambda

Что я и делаю, увеличиваю диапазон лямбды до (-21, -20, 0,01) и затем получаю следующую ошибку в первом столбце.

Error in shapiro.test(store2[[x]]) : all 'x' values are identical

Однако данные не идентичны. Это только определенные столбцы в моем фрейме данных, которые делают это, и я не знаю почему. Четвертый столбец, который вызывает первую ошибку, таков: 1,539 1,587 1,558 1,625 1,651 1,659 1,654 1,643 1,53 1,552 1,537 1,522 1,559 1,636 1,57 1,631 1,544 1,625 1,552 1,519 1,556 1,528 1,616 1,554 1,571 1,534 1,574 1,578 1,574 1,533 1,54 1,531 1,561 1,576 1,624 1,593 1,557 1,556 1,559 1,59

Первый столбец: 6.301 6,611 6,448 7,049 7,068 7,208 7,215 7,084 6,129 6,471 6,295 5,984 6,34 7,052 6,448 6,885 6,42 6,963 6,169 6,185 6,289 6,05 6,901 6,333 6,458 6,228 6,458 6,477 6,71 6,296 6,147 6,171 6,278 6,667 6,932 6,646 6,369 6,408 6,466 6,688

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 26 марта 2019

Одна вещь, которую вы всегда должны иметь в виду в R, заключается в том, что при разработке R стремится просто продолжать работать, несмотря ни на что, принуждать и преобразовывать данные, даже если некоторые преобразования на самом деле не имеют смысла.Это приводит к сообщениям о значениях и ошибках, которые не имеют смысла, и именно это может происходить здесь.Если вы проверяете результат as.matrix(as.numeric(...)), для каждого из этих столбцов, скорее всего, это не то, что вы ожидаете.

Не зная точно, как работает boxcoxnc, я предлагаю следующий альтернативный код, чтобы сделатьэто более читабельно и, возможно, даже может исправить ошибку, но это большое возможно:

for (col in 2:27) {
  model <- boxcoxnc(data[,col], method="sw", lambda = seq(-20,20,0.01))
  # what are you trying to do with model here, it is rewritten every time.
}

Комментарии:

  1. подмножество оригинального data не нужно, так какВы итерируете столбцы по индексу.

  2. , даже когда data[col] будет работать (поскольку data.frame на самом деле является списком столбцов), более уместно сделать data[,col],Также вместо length(data) вы должны написать ncol(data), но это выражение в любом случае пропало.

  3. as.matrix (as.numeric (unlist (...))) кажется совершенно ненужнымздесь и есть просто шанс, что что-то пойдет не так с точки зрения того, что R делает непреднамеренное преобразование.Возможно, что .numeric необходимо, если boxcoxnc немного специфично и действительно не может принимать ничего, кроме числового вектора.

  4. as.numeric(seq(...)) может быть просто sec(...);было бы удивительно, если бы seq вернул бы что-нибудь кроме числового вектора.

Теперь, что вы должны рассмотреть, возможно, некоторые из этих столбцов не содержат числовые данные.Если он говорит числа, но в виде строк, то да, вам нужно as.numeric.Можете ли вы подтвердить, что нет столбца, который бы содержал что-либо, кроме числовых и целочисленных данных?Строки или факторы могут быть проблематичными и могут быть основной причиной ваших проблем.Каков результат:

sapply(d, class)

Кстати apply предпочтительнее циклов for, поэтому, возможно, вы захотите пойти по этому пути, возможно, вы будете делать что-то вроде этого:

models <- sapply(data[,2:27], function(col) {  
       boxcoxnc(col, method="sw", lambda = seq(-20,20,0.01)) 
})
...