Jak naprawiê popsutπ zabawkí Transformacje zmiennych w modelach liniowych Piotr J. Sobczyk Data analysis is an artful science! It involves making subjective decisions using very objective tools! Znalezione w notatkach wyk adu Stat 50 z PennState Na dzisiejszych zajíciach poznamy kilka sposóbów na radzenie sobie z danymi, które nie pasujπ do za oøeò modelu liniowego. ByÊ moøe miídzy zmiennymi objaúniajπcymi, a zmiennπ objaúniajπcπ jest zaleønoúê, ale nie jest ona liniowa. W takim wypadku naleøy dokonaê transformacji danych Transformacje zmiennych objasniajπcych Przede wszystkim dodajemy nowe zmienne, np. x. Mogπ byê teø bardziej skomplikowane przekszta cenia i dyskretyzacja. Weümy dane dotyczπce uczenia sií jízyka obcego. Od momentu nauki sprawdzamy jaki procent s ówek pozostaje w pamiíci. Dostajemy nastípujπce dane. Interesuje nas jaka jest zaleønoúê, chcielibyúmy potrafiê przewidywaê procent pamiítanych s ów po danym czasie. Notabene na podobnej idei sπ oparte systemy takie jak supermemo. wordrecall=read.csv("datasets/wordrecall.txt", sep= \t ) str(wordrecall) data.frame : 3 obs. of variables: $ time: int 5 5 30 0 0 40 480 70 440... $ prop: num 0.84 0.7 0. 4 0.47 0.45 0.38 0.3 0.... Dopasujemy model liniowy: recall.lm=lm(prop~time, data=wordrecall) summary(recall.lm) Call: lm(formula = prop ~ time, data = wordrecall) Residuals: Min Q Median 3Q Max -0.854-0.93-0.04495 0.0849 0.348 Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) 5.59e-0 4.88e-0 0.774 3.49e-07 *** time -5.57e-05.457e-05-3.85 0.008 ** --- Signif. codes: 0 *** 0.00 ** 0.0 * 0.05. 0. Residual standard error: 3 on degrees of freedom Multiple R-squared: 709, Adjusted R-squared: 38 F-statistic: 4.3 on and DF, p-value: 0.0087 Niez e R, istotne wspó czynniki. A co z diagnostykπ?
par(mfrow=c(,)) plot(recall.lm) Residuals 0. 0. Residuals vs Fitted 0 0.0 0. 0. 0.3 0.4 Normal Q Q 3.5.5 Theoretical Quantiles 0.0.0 Scale Location 3 0.0 0. 0. 0.3 0.4 Residuals vs Leverage 0.0 0. 0.4 0. 3 Leverage par(mfrow=c(,)) Residua sπ normalne. Mamy natomiast problem z kiepskim dopasowaniem i niejednorodnπ wariancjπ. Mamy jednπ obserwacjí wp ywowπ, ale byê moøe jest ona wynikiem z ego dopasowania, wiíc póki co nie bídziemy sií niπ zajmowaê. ggplot(wordrecall, aes(x=time, y=prop))+ geom_point() + stat_smooth(method = "lm", se = F)
0.8 0. prop 0.4 0. 0.0 0 500 5000 7500 0000 time Przeszkta camy zmiennπ x, poniewaø zaleønoúê nie wyglπda na liniowπ. Na takπ potrzebí wskazuje teø wykres Fitted vs Residuals. Jedna z moøliwych strategii to symetryzacja zmiennej time. MASS::boxcox(time~, data=wordrecall) 95% log Likelihood 0 80 0 40 0 recall.lm=lm(prop~log(time), data=wordrecall) summary(recall.lm) λ 3
Call: lm(formula = prop ~ log(time), data = wordrecall) Residuals: Min Q Median 3Q Max -0.03077-0.05330-0.0045 0.0797 0.037799 Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) 0.8445 0.0495 59.3 3.5e-5 *** log(time) -0.0797 0.004-3.80.53e- *** --- Signif. codes: 0 *** 0.00 ** 0.0 * 0.05. 0. Residual standard error: 0.0339 on degrees of freedom Multiple R-squared: 0.9899, Adjusted R-squared: 0.989 F-statistic: 07 on and DF, p-value:.55e- Wielka róønica! Teraz R jest bardzo wysokie! Sprawdümy jeszcze czy naszej regresji nie zepsuliúmy. par(mfrow=c(,)) plot(recall.lm) Residuals 0.04 0.0 Residuals vs Fitted 9 7 3 0. 0.4 0. 0.8 Normal Q Q 9 7 3.5.5 Theoretical Quantiles 0.0 0.8 Scale Location 3 7 9 0. 0.4 0. 0.8 0 Residuals vs Leverage 7 9 3 0.0 0. 0. 0.3 Leverage par(mfrow=c(,)) Lekko niepokoiê moøe nas obserwacja 3 z duøa miarπ Cooka. Czy moglibyúmy dokonaê transformacji zmiennej objaúnianej? 4
MASS::boxcox(prop~time, data=wordrecall) -> boxcox.result log Likelihood 5 0 5 0 5 95% 0 lambda=boxcox.result$x[which.max(boxcox.result$y)] recall.lm3=lm(i((prop^lambda-)/lambda)~log(time), data=wordrecall) summary(recall.lm3) Call: lm(formula = I((prop^lambda - )/lambda) ~ log(time), data = wordrecall) Residuals: Min Q Median 3Q Max -3.44-0.47 0.3974 0.880.59 Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept).08 0.83.45 0.747 log(time) -0.085 0.47-4.95 0.007 ** --- Signif. codes: 0 *** 0.00 ** 0.0 * 0.05. 0. Residual standard error:.37 on degrees of freedom Multiple R-squared: 0.4, Adjusted R-squared: 95 F-statistic: 8.44 on and DF, p-value: 0.007 Jest lepiej jeúli chodzi o R, a jak wyglπdajπ wykresy diagnostyczne? qqnorm(y=mass::stdres(recall.lm3), ylim = c(-3,3)) abline(a=0, b=, add=true) Warning in int_abline(a = a, b = b, h = h, v = v, untf = untf,...): "add" is not a graphical parameter λ 5
Normal Q Q Plot Sample Quantiles 3 0 3.5.0 0.0.0.5 Theoretical Quantiles Residua nie sπ normalne. TrochÍ moøemy sií tego spodziewaê, skoro przed transformacjπ by y normalne. Transformacje zmiennej objaúnianej Uwaga. Nie robimy tego po to, øeby zmienna objaúniana mia a rozk ad normalny. To nie jest nasze za oøenie! Za oøenie dotyczy rozk adu reszt. Przekszta cenie boxcoxa. y Õ = I y dla = 0 log( ) dla =0 Sprawdümy jak dzia ajπ przekszta cenia na danych dotyczπcych czasu trwania ciπøy w ssaków. # codepages <- setnames(iconvlist(), iconvlist()) # x <- lapply(codepages, function(enc) try(read.csv("datasets/mammgest.txt", # fileencoding=enc, # nrows=3, header=true, sep="\t"), silent=t)) # unique(do.call(rbind, sapply(x, dim))) # maybe_ok <- sapply(x, function(x) istrue(all.equal(dim(x), c(3,3)))) # codepages[maybe_ok] # x[maybe_ok] mamgest=read.csv("datasets/mammgest.txt", sep="\t", header=t, fileencoding = "UTF-") str(mamgest) data.frame : obs. of 3 variables: $ Mammal : Factor w/ levels "Bear","Camel",..: 0 3 9 7 8 5... $ Birthwgt : num.75 4 0.48.5 0.37 50 30 40 40 98... $ Gestation: int 55 75 90 0 3 43 340 380 390 457...
gestation.lm=lm(gestation~birthwgt, data=mamgest) summary(gestation.lm) Call: lm(formula = Gestation ~ Birthwgt, data = mamgest) Residuals: Min Q Median 3Q Max -3.5-34.0 7.53 47. 77.09 Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) 87.0837.94.944.73e-05 *** Birthwgt 3.594 47.844 7.5e-05 *** --- Signif. codes: 0 *** 0.00 ** 0.0 * 0.05. 0. Residual standard error:.09 on 9 degrees of freedom Multiple R-squared: 0.8388, Adjusted R-squared: 0.809 F-statistic: 4.84 on and 9 DF, p-value: 7.53e-05 ggplot(mamgest, aes(x=birthwgt, y=gestation))+ geom_point() + stat_smooth(method = "lm", se = F) 00 500 Gestation 400 300 00 0 30 0 90 Birthwgt Wydaje sií, øe wszystko jest ok. Wspó czynniki duøe, R bardzo wysokie. Ale diagonostyka g upcze. 7
par(mfrow=c(,)) plot(gestation.lm) Residuals 00 50 Residuals vs Fitted 0 00 300 400 500 00 0 Normal Q Q 0.5.5 Theoretical Quantiles 0.0 0.8 Scale Location 00 300 400 500 00 0 0 Residuals vs Leverage 0 0.0 0. 0. 0.3 0.4 Leverage par(mfrow=c(,)) ByÊ moøe jest ma y problem z normalnoúciπ residuów. Dopasowanie jest w miarí ok, ale wariancja wydaje sií byê niejednorodna. Zobaczmy co mówiπ testy. #normalnosc reszt shapiro.test(mass::stdres(gestation.lm)) Shapiro-Wilk normality test data: MASS::stdres(gestation.lm) W = 0.95548, p-value = 0.744 #jednorodnosc wariancji bptest(gestation.lm) studentized Breusch-Pagan test data: gestation.lm BP = 3.7739, df =, p-value = 0.050 gqtest(gestation.lm) Goldfeld-Quandt test data: gestation.lm 8
GQ =.789, df = 4, df = 3, p-value = 0.0487 Mamy jednπ obserwacjí wp ywowπ, ale byê moøe jest ona wynikiem z ego dopasowania, wiíc póki co nie bídziemy sií niπ zajmowaê. MASS::boxcox(Gestation~Birthwgt, data=mamgest) -> boxcox.result log Likelihood 0 3 4 5 95% 0 lambda=boxcox.result$x[which.max(boxcox.result$y)] mamgest=cbind(mamgest, GestationTransf=(mamgest$Gestation^lambda-)/lambda) mamgest.lm=lm(log(gestation)~birthwgt, data=mamgest) summary(mamgest.lm) Call: lm(formula = log(gestation) ~ Birthwgt, data = mamgest) Residuals: Min Q Median 3Q Max -0.303-0.50 0.05 8 0.709 Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) 5.7887 0.08877 59.8 5.e-3 *** Birthwgt 0.0040 0.0077.0 0.00088 *** --- Signif. codes: 0 *** 0.00 ** 0.0 * 0.05. 0. Residual standard error: 0.3 on 9 degrees of freedom Multiple R-squared: 0.8033, Adjusted R-squared: 0.784 F-statistic: 3.75 on and 9 DF, p-value: 0.000878 Jest lepiej jeúli chodzi o R, a jak wyglπdajπ wykresy diagnostyczne? par(mfrow=c(,)) plot(mamgest.lm) λ 9
Residuals 0.3 0. Residuals vs Fitted 9 5.4 5. 5.8.0..4.5 Normal Q Q 9.5.5 Theoretical Quantiles 0.0 0.. Scale Location 9 5.4 5. 5.8.0..4.5 Residuals vs Leverage 0 0.0 0. 0. 0.3 0.4 Leverage par(mfrow=c(,)) R jest niøsze, ale wariancja jest teraz jednorodna. Dodatkowo pozbyliúmy sií obserwacji odstajπcych. Sprawdümy jeszcze czy nie zepsuliúmy normalnoúci residuów #normalnosc reszt shapiro.test(mass::stdres(mamgest.lm)) Shapiro-Wilk normality test data: MASS::stdres(mamgest.lm) W = 0.9948, p-value = 0.343 #jednorodnosc wariancji bptest(mamgest.lm) studentized Breusch-Pagan test data: mamgest.lm BP = 0.0347, df =, p-value = 0.85 gqtest(mamgest.lm) Goldfeld-Quandt test data: mamgest.lm GQ = 4.887, df = 4, df = 3, p-value = 0.8 0
Dlaczego transformacje (logarytmiczne) pomagajπ? Chcemy uchwyciê zaleønoúê y od x. W modeli liniowym zak adamy, øe jest ona liniowa. Co jeúli jest inaczej? y = 0 e x W takim wypadku na oøenie logarytmu przekszta ca model multikplikatywny na liniowy log(y) = 0 + x Podobnie dla danych zgodnych z zaleønoúciπ potígowπ mamy y = 0 x log(y) = 0 + log(x) Zaú w przypadku zaleønoúci: y = x 0 + x y = + 0 x Regu y kciuka dla transformacji zmiennych:. StÍøenia - przekszta cenie logarytmiczne. Procenty - arc sin 3. Przekszta cenie powinno mieê logiczne uzasadnienie. Pytanie kontrolne: czy narysowanie wykresu z danymi w tej skali jest przekonywajπce? Regresja wielomianowa data(women) ggplot(women, aes(x=height, y=weight)) + geom_point() + stat_smooth(method = "lm", se = F, fullrange = T)
0 50 weight 40 30 0 fit = lm(weight ~ height, women) par(mfrow=c(,3)) plot(fit, :) 0 4 8 7 height
Residuals 0 3 Residuals vs Fitted 5 8 0 8 Normal Q Q 5 0.0.0.5 Scale Location 5 8 0 40 0 0 0 40 0 Theoretical Quantiles 0.0 0.4 0.8 5 4 0 Residuals vs Leverage Cook's dist vs Leverage h ii ( 4 5 0.0 0.4 0.8.5 4 5.5 0 4 8 Obs. number par(mfrow=c(,)) 0.00 0.0 0.0 Leverage 0.05 0. Leverage h ii Bardzo z e residua, mimo, øe na pierwszy rzut oka, wszystko wyglπda dobrze. Problem z normalnoúciπ residuów wskazuje na problem ze skalπ zmiennej objaúnianej. Dwa punkty wp ywowe - najmniejszy i najwiíkszy x. ByÊ moøe zaleønoúê nie jest liniowa. Spróbujmy dodaê do modelu wyøsze rzídy. fit = lm(weight ~ height + I(height^), women) summary(fit) Call: lm(formula = weight ~ height + I(height^), data = women) Residuals: Min Q Median 3Q Max -094-0.9-0.0094 0.85 970 Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept).8788 5.977 0.393.3e-07 *** height -7.3483 0.7779-9.449.58e-07 *** I(height^) 0.0830 0.00598 3.89 9.3e-09 *** --- Signif. codes: 0 *** 0.00 ** 0.0 * 0.05. 0. Residual standard error: 0.384 on degrees of freedom Multiple R-squared: 0.9995, Adjusted R-squared: 0.9994 F-statistic:.39e+04 on and DF, p-value: <.e- 3
par(mfrow=c(,3)) plot(fit, :) Residuals 0. 0.0 0.4 Residuals vs Fitted 5 3 0 3 Normal Q Q 5 0.0.0.5 Scale Location 5 3 0 40 0 0 0 40 0 Theoretical Quantiles 0.0 0.4 0.8. 5 3 0 Residuals vs Leverage Cook's dist vs Leverage h ii ( 3 5 0.0 0.4 0.8..5 3.5 5 0 4 8 Obs. number par(mfrow=c(,)) 0.0 0. 0. 0.3 0.4 Leverage 0. 0.4 Leverage h ii fit3 = lm(weight ~ height + I(height^), women, subset = -5) summary(fit3) Call: lm(formula = weight ~ height + I(height^), data = women, subset = -5) Residuals: Min Q Median 3Q Max -0.4390-0.337 0.004 0.3839 07 Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) 9.88 4.37499 9.403.3e-0 *** height -.3007 0.75758-8.38 4.45e-0 *** I(height^) 0.07483 0.00587.75.e-08 *** --- Signif. codes: 0 *** 0.00 ** 0.0 * 0.05. 0. Residual standard error: 0.38 on degrees of freedom Multiple R-squared: 0.999, Adjusted R-squared: 0.9995 F-statistic:.78e+04 on and DF, p-value: <.e- par(mfrow=c(,3)) plot(fit3, :) 4
Residuals 0.4 0.0 0.4 Residuals vs Fitted 0 4 0 Normal Q Q 0 4 0.0.0.5 Scale Location 4 0 0 30 40 50 0 0 0 30 40 50 0 Theoretical Quantiles 0.0.0.5 4 3 0 Residuals vs Leverage Cook's dist vs Leverage h ii ( 3 4 0.0.0.5.5 3.5 4 0 4 8 0 4 Obs. number par(mfrow=c(,)) 0.0 0. 0. 0.3 0.4 Leverage 0. 0.3 0.4 Leverage h ii Zmiany sπ bardzo ma e. Obserwacja 5 jest wp ywowa, ale nie zmienia duøo. Czy warto dodawaê 3 potígí? Niekonicznie, grozi nam zbytnie dopasowanie sií do modelu (overfitting). Zasada dotyczπca umieszczania kolejnych wielomianów od x jest nastípujπca, jeúli uøywamy wielomianu o stopniu k, to powinniúmy teø uøywaê wielomianów o wyk adnikach <k. Metody radzenia sobie z obserwacjami odstajπcymi i wp ywowymi DziÍki diagnostyce regresji moøemy zidentyfikowaê dwa rodzaje problematycznych obserwacji. Outliers Pierwszy to obserwacje odstajíce (ang. outliers). Sπ to punkty, do których regresja sií üle dopasowa a. Nie muszπ byê one szkodliwe dla naszej regresji. which(rstudent(fit)>) 5 5 Dlaczego? *(-pnorm()) [] 0.045500 5
Influential observations Drugi rodzaj to obserwacje wp ywowe, czyli takie, których obecnoúê wp ywa na zmianí wartoúci wspó czynników bardziej niø pozosta e punkty. Te obserwacje teø nie muszπ byê szkodliwe dla regresji. Wp ywowoúê mierzymy poprzez wartoúê düwigni (leverage). which(hatvalues(fit)>*ncol(fit$model)/nrow(fit$model)) 5 5 Zauwaømy, øe wp ywowoúê zaleøy wy πcznie od macierzy X, a nie od y. Czyli jest to wartoúê niezaleøna od dopasowania modelu liniowego. Bardzo duøym problemem sπ obserwacje, które sπ jednoczeúnie odstajπce i wp ywowe. Ich niedoposowanie psuje wtedy ca y model (patrz zestaw drugi z Anscombe quartet). Co zrobiê w przypadku problemów z konkretnπ obserwacjπ? ByÊ moøe jest to niepoprawna dana. Naleøy sprawdziê czy nie zosta a na przyk ad przypadkiem niepoprawnie wprowadzona. Zanim usunie sií danπ, trzeba sií zastanowiê nad innym moøliwymi rozwiπzaniami. Moøe zaleønoúê nie jest liniowa i naleøy dokonaê transformacji zmiennych objaúniajπcych? Moøe brakuje nam jakiejú zmiennej objaúniajπcej? Jeúli usuwamy obserwacje wp ywowe o duøej wartoúci x, to powinniúmy wyraünie zaznaczyê, øe nasz model dzia a tylko na wartoúciach x z pewnego zakresu. infekcje=read.csv("datasets/hospital_infct_03.txt", sep="\t", fileencoding = "UTF-") ggplot(infekcje, aes(x=stay, y=infctrsk)) + geom_point() + geom_vline(xintercept = 5, col="red") 8 InfctRsk 4 0 5 0 Stay UsuniÍcie obserwacji musi byê uzasadnione! Nie jest wystarczajπcym powodem fakt, øe model üle sií dopasowuje (czyli podkrícenie" wartoúci R ). Jeúli usuniície punktu nie wp ywa na wynik analizy, to lepiej
go zostawiê (oczywiúcie umieszczajπc informacjí o obserwacji odstajπcej) First, foremost, and finally it s okay to use your common sense and knowledge about the situation. from Stat 50 z PennStat 7