Rstudio, obserwacje odstające, kwartyle

0

Cześć :) Dopiero zaczynam swoją przygodę z programowaniem w R a już zostałam rzucona(chyba) na głęboką wodę. Muszę zrobić takie zadanie:

Stwórz funkcję wskazującą obserwacje odstajace z podanego wektora liczb rzeczywistych (x <-rcauchy(10)), wykorzystujacą regule kwartylow:( Q1-1.5(Q3-Q1); Q1+1.5(Q3-Q1). Funkcja powinna zwracac obiekt z podanymi atrybutami zawierajacymi informacje:

  1. jakie wartosci sa odstające
  2. jakie wartosci sa nieodstające
  3. indeksy wartosci odstających
  4. indeksy wartosci nieodstających

(wykorzystaj funkcje quantile, which, attr).
Nie mam pojęcia jak sie do tego zabrać :(

0

Wyjaśnij dokładnie ten fragment: "Q1-1.5(Q3-Q1); Q1+1.5(Q3-Q1)"

0
lion137 napisał(a):

Wyjaśnij dokładnie ten fragment: "Q1-1.5(Q3-Q1); Q1+1.5(Q3-Q1)"

Obserwacja odstająca to obserwacja, która nie należy do poniższego przedziału:

X∉[Q1–k(Q3−Q1),Q3+k(Q3−Q1)] gdzie k > 0

Najczęściej przyjmuje się k = 1.5

Wtedy wzór wygląda następująco:

X∉[Q1–1.5(Q3−Q1),Q3+1.5(Q3−Q1)]

lion137 napisał(a):

Wyjaśnij dokładnie ten fragment: "Q1-1.5(Q3-Q1); Q1+1.5(Q3-Q1)"

Jesteś w stanie mi z tym pomóc?

1

Mniej więcej tak:

vec <-rcauchy(10)



find_outliers <- function(vec, k = 1.5) {
  quantiles <- quantile(vec, c(0.25, 0.5, 0.75))
  diff <- k * (quantiles[3] - quantiles[1])
  lb <- quantiles[1] - diff 
  ub <- quantiles[3] + diff
  
  is_outlier <- function(el) {
    el < lb || ub < el  
  }
  
  outlier_mask <- sapply(vec, is_outlier)

  
  list(
    is_outlier = outlier_mask,
    outlayer_indexes = which(outlier_mask),
    not_outlayer_indexes =  which(!outlier_mask) 
  )
}

find_outliers(vec)

Nie wiem po co sugerowane jest użycie attr.

0
efffka napisał(a):
lion137 napisał(a):

Wyjaśnij dokładnie ten fragment: "Q1-1.5(Q3-Q1); Q1+1.5(Q3-Q1)"

Jesteś w stanie mi z tym pomóc?

Jeśli Uimiesz napisać prostą funkcję w R , to tak.

0

Niestety nie działa
Dlaczego tutaj: el < lb || ub < el jest operator 'lub' a nie 'i'?
I co to jest function(el)?

0

Niestety nie działa

Co dokładnie nie działa?

Dlaczego tutaj: el < lb || ub < el jest operator 'lub' a nie 'i'?

Żeby element był autlaierem musi być mniejszy od lewej granicy przedziału lub większy od prawej granicy przedziału.

I co to jest function(el)?

Tworzę funkcję z jednym argumentem el.

0

Już działa, diff <- k * (quantiles[3] - quantiles[1]) tutaj trzeba było poprawić na quantile bez 's' i zmienić nawiasy na (). Dziękuje :)

0

Jesteś pewna?

quantile(1) zwróci Ci wektor 5 jedynek, a quantile(1) zwróci Ci wektor 5 trójek. To raczej nie jest coś czego potrzebujesz.

quantiles <- quantile(vec, c(0.25, 0.5, 0.75))

to wylicza wektor o wartościach Q1, Q2 i Q3. następnie wykorzystuję to między innymi w tej linijce

diff <- k * (quantiles[3] - quantiles[1])
0

Już rozumiem :) a czy mogłbyś mi jeszcze powiedzieć co robi funkcja sapply?

0

To trochę zależy od pozostałych argumentów, które przyjmuje ta funkcja. Ale zwykle (w powyższym przykładzie również) przyjmuje jako pierwszy argument wektor/ listę, na każdym elemencie wykonuje operację określoną w drugim argumencie i zwraca wektor tak przetworzonych elementów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1