Учитывая ЛСД и значения - выводим значащие буквы - PullRequest
0 голосов
/ 21 января 2019

Я искал библиотечные функции для этого, но я удивлен, что не могу найти одну.

В R довольно много функций статистики, которые выполняют статистический тест, а затем выводят таблица, содержащая буквы, обозначающие группы значимости, например, LSD.test. Пример того, как можно рассчитать LSD и использовать его для создания букв многократного сравнения, используемых в графе

Есть и другие. Все примеры, которые я смог найти, работают на модельном объекте, а затем выполняют свою работу. Тем не менее, у меня уже есть ЛСД значения и средства - и я хочу работать с ними напрямую. Я искал общую функцию, которую используют все эти методы многократного сравнения для выполнения этого последнего шага, но не могу ее найти.

Итак, это то, что я хочу сделать ... учитывая наименьшую значимую разницу между значениями (LSD) и средними значениями, которые они сами имеют:

lsd <- 1.0
vals <- c(2,3,3.5,4,4.2,6.0)

Я хочу, чтобы я хотел выводить что-то вроде:

2 a
3 b
3.5 bc
4 c
4.2 c
6.0 d

, где значения, за которыми следует одна и та же буква, незначительно отличаются, исходя из значения наименьшего значимого различия.

В идеале было бы лучше, если бы он мог обрабатывать неупорядоченный список значений ...

vals <- c(6.0, 2, 3.5, 4.0, 4.2, 3)

производит вывод:

6.0 d
 2  a
3.5 bc
4.0 b
4.2 c
3 c

Я думал, что большинство этих функций LSD.test и мультисравнения вероятно, используют базовую функцию для составления списка писем, но я не смог его найти.

Работая через проблему, я думаю, что это делает трюк, но это довольно уродливо ...

 lsd.letters <- function(vals, lsd) {
  #find their order
  #record their order
  indx <- order(vals)
  #sort their order
  srt <- vals[indx]
  #assign a variable of letters
  lts <- letters
  #create a character vector
  siglets <- rep("", length(vals))#c("a",rep("", length(vals)-1))
  #use a single pass through the list of means
  #use the first letter a for the lowest value
  itlet <- 1
  for (i in c(1:(length(vals)))){
    crnt <- srt[i]
    clet <- lts[itlet]

    #is this value within the LSD of any other value in the remaining list 

    ix <- which(srt[i:length(srt)] < (crnt+lsd))+i-1


    for (ix2 in ix){
        newletter <- 0
        if (length(intersect( unlist(strsplit(siglets[i], "")), unlist(strsplit(siglets[ix2], "")))) == 0){
          #If the  string for this mean does not already contain a letter in common for the current step mean... assign the letter
          #siglets[ix2] <- paste0(siglets[ix2],clet)
          newletter <- 1
        }
    }

    if (newletter == 1){
      siglets[ix] <- paste0(siglets[ix],clet)
      itlet <-  itlet + 1  
        }


  }
  siglets
}

Это некрасиво, и я еще не сортирую вывод (сортировать легко).

Есть ли библиотечная функция для этого? Или кто-нибудь написал лучший подход для этого?

Спасибо за вашу помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...