Advertisement
Guest User

Untitled

a guest
Jan 17th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 4.72 KB | None | 0 0
  1. # Przygotowanie danych
  2. rm(list=ls())
  3. colors = c("red", "green", "blue")
  4. iris.train = read.csv2("irysy_trening.csv", row.names = 1)
  5. iris.test = read.csv2("irysy_prognoza.csv", row.names = 1)
  6. names(iris.train) = c("SL", "SW", "PL", "PW", "Species")
  7. names(iris.test) = c("SL", "SW", "PL", "PW", "Species")
  8. attach(iris.train)
  9.  
  10. ### Wielowymiarowa analiza wariancji
  11. # (Dla jednowymiarowej anovej jest przygotowany poprzedni skrypt)
  12.  
  13. # Sprawdzenie jak bardzo, jako całość, różnią się PL, PW, SL, SW w grupach
  14. model = manova(cbind(PL, PW, SL, SW) ~ Species)
  15. summary(model)  # statystyka Lambda jest przerabiana na F (approx F)
  16. summary(model, "Wilks") # można uzyskać statystykę Wilka
  17. # Ogólnie powyższe statystyki pozwalają nam ocenić, czy statystyki różnią się między grupami
  18. # Tzn każda funckja dyskryminacyjna odpowiada wektorowi własnemu pewnej macierzy
  19. # A hipotezą zerową jest, czy wszystkie wartości własne to 0
  20. # Bo jeśli tak jest to wartości PL, PW, SL, SW nie różnią się między grupami
  21.  
  22. # Sprawdzenie, dla jakich współczynnikach wartość statystyki F będzie największa
  23. library(MASS)
  24. model.lda = lda(cbind(PL, PW), grouping = Species)
  25. lda(Species ~ PL + PW) # znowu, to jest ten sam sposób zapisania tego co wyżej
  26. # Zauważymy, że współczynniki przy LD1 to 1.33 oraz 2.63
  27. summary(aov(PL + PW ~ Species)) # małe F
  28. summary(aov(1.331925*PL + 2.630017*PW ~ Species)) # największe możliwe F
  29. # więc zmienna postaci 1.331925*PL + 2.630017*PW najlepiej rozróżnia grupy
  30.  
  31. # Test: Sprawdzamy, czy wartości własne (posortowane malejąco) od k+1-ego miejsca są równe 0
  32. # Czyli jak wybieramy k = 1, to sprawdzamy czy od 2 miejsca wzwyż wszystki wartości własne są równe 0
  33. # H0: wartość własna k+1 = wartość własna k+2 = ... = wartość własna n
  34. # Ha: w przeciwnym przypadku
  35. # Statystyka lambda = floor(n - 1 + (p+g)/2)*{suma od k+1 do r}{ln(1+wartość własna i-ta)}
  36. # Stopnie swobody: (p-k)(n-k-1) (na wykładzie jest (p-k)(g-k-1) - prawdopodobnie źle)
  37. # Oznaczenia: g - ilośc grup; p - ilość zmiennych losowych oruginalnych; k - sami wybieramy; n - liczba rekordów (wierszy, obserwacji)
  38.  
  39. a = floor(model.lda$N - 1 + (4 + 3) / 2) # floor(n - 1 + (p+g)/2)
  40. chi = a * log(1+model.lda$svd) # *{suma od k+1 do r}{ln(1+wartość własna i-ta)}
  41. chi[2] # dla k = 1 sumujemy tylko jeden wyraz, czyli wybieramy ten
  42. st.swobody = (4-1) * (60 - 2) # (p-k)(n-k-1)
  43. # 1 sposób:
  44. 1 - pchisq(chi[2], st.swobody) # wychodzi nam, p.value= 1, więc nie można odrzucić hipotezy, że wartość własna dla LD2 wynosi 0, czyli LD2 nie ma znaczenia
  45. # 2 sposób:
  46. chi[2] < qchisq(0.95, 174) # więc nie można odurzucić hipotezy zerowej
  47.  
  48. ### LDA (analiza dyskryminacyjna)
  49. model.lda = lda(Species ~ ., data = iris.train)
  50. prediction = predict(model.lda)
  51. prediction$x[,1] -> LD1
  52. prediction$x[,2] -> LD2
  53. plot(LD1, LD2, col=colors[Species]) #wykres pokazujący, jak wyglądają funkcje dyskryminacyjne
  54. plot(model.lda) # tu dostajemy to samo, tylko brzydko
  55. ldahist(LD1, Species) #histogramy dla każdej z grup względem funkcji LD1, tej najlepszej
  56. ldahist(LD2, Species) #a tu względem tej najgorszej
  57.  
  58. # Parametry LDA:
  59. model.lda$svd # wartości własne odpowiadającem funkcjom LD1, LD2
  60. model.lda$means # średnie w grupach
  61. model.lda$scaling # parametry funkcji
  62. predict(model.lda, as.data.frame(model.lda$means))$x # średnie w grupach dla funkcji LD1, LD2
  63. predict(model.lda, iris.test)$x # wartościu funkcji dyskryminacyjnych dla danych testowych
  64. predictions.test = predict(model.lda, iris.test)$class # predykcje za pomocą LDA
  65. table(predictions.test, iris.test$Species) # sprawdzenie skuteczności
  66. predict(model.lda, iris.test, prior = c(0.5, 0.49, 0.01))$class # można wspomagać się znając prawdopodobieństwa należenia do grup
  67. # Uwaga: nie stosować powyższego sposobu, gdy jedna z wartości będzie skrajnie mała, np. 0.00001
  68.  
  69. # Test: Sprawdzamy, czy zmienna jest istotnie statystyczna w LDA
  70. # H0: Statystyka jest nieistotna
  71. # Ha: Statystyka jest istotna
  72. # Statystyka: F = (n-g-j) / (g-1) * ( lambda_bez_zmiennej / lambda_ze_zmienna - 1)
  73. # Gdzie: n - ilość wierszy, obserwacji; g - ilość grup;
  74. # j - ilośc zmiennych objaśniających (ale bez tej którą sprawdzamy, czyli wszystkie zminne objaśniające - 1)
  75. # lambdy - statystyki wilka
  76. # Stopnie swobody: n-g-j, g-1
  77. library(rrcov)
  78. vine.train = read.csv2("wino.trening.csv", row.names = 1)
  79. Wilks.test(typ ~ ., data = vine.train)$wilks-> L13
  80. Wilks.test(typ ~ . - proline, data = vine.train)$wilks -> L12
  81. F <- 30 / 2 * (L12 / L13 - 1) # 30  = 45 - 3 - (13 - 1)
  82. F > qf(p=0.95, df1 = 2, df2 = 30)
  83. # więc odrzucamy hipotezę zerową, nie można powiedzieć, że zmienna proline nie ma wpływu na gatunek wina
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement