W tej części kursu zajmiemy się interakcjami między zmiennymi w regresji wielokrotnej. Temat podzielimy na dwie części. Pierwsza z nich poświęcona będzie zmiennym ciągłym, druga zaś nominalnym. Problematyka interakcji wygląda dość podobnie dla obu rodzajów zmiennych, niemniej jest kilka istotnych różnic, które należy omówić. Dziś będzie trudniejsza część, czyli zmienne ciągłe.
Na dzisiejszych zajęciach korzystać będziemy ze znanych już Państwu
pakietów pander
, knitr
, car
oraz
carData
. Pracować będziemy na zbiorze danych, którego
dotyczyło zadanie domowe z poprzedniego, czyli na zbiorze
Salaries
dostępnym w pakiecie carData
, w
którym znajdują się dane o wynagrodzeniach pracowników uniwersyteckich w
Stanach Zjednoczonych. Na początek wczytamy odpowiednie pakiety.
library(pander)
library(knitr)
library(carData)
library(car)
Pojęcie interakcji często wprowadza konfuzję u tych, którzy go jeszcze nie znają. W tej sekcji skoncentrujemy się więc na próbie intuicyjnego uchwycenia tego pojęcia. W tym celu posłużę się przykładem z książki “Applied Multiple Regression” (Cohen, Cohen, West, Aiken 2003), którą mają Państwo dostępną w materiałach dla zalogowanych.
“Wiele teorii w naukach społecznych stawia hipotezę, że dwie (lub więcej) ciągłe zmienne wchodzą w interakcję. Rozważmy jako przykład problem tego jak umiejętności (X) oraz motywacja (Z) wpływają na osiągnięcia na studiach wyższych [graduate school nie ma dobrego odpowiednika, ale w tym wypadku nie ma to żadnego znacznienia - BM]. Pierwsza możliwość jest taka, że ich efekty się ze sobą kumulują. Połączony wpływ umiejętności i motywacji na osiągnięcia będzie równy sumie odrębnych efektów; brak interakcji między X i Z. Można powiedzieć, że całość równa się sumie części. Drugą alternatywą jest to, że umiejętności i motywacja wchodzą w synergistyczną interakcję, tak że studenci z zarówno wysokimi umiejętnościami jak i wysoką motywacją osiągają znacznie więcej na studiach niż przewidywalibyśmy na podstawie efektów prostej sumy efektów umiejętności i motywacji. Studenci, którzy brylują w obu tych aspektach stają się ,,gwiazdami’’; powiedzielibyśmy w tym przypadku, że całość jest większa, niż jej części. Trzecia alternatywa jest taka, że umiejętności oraz motywacja kompensują się wzajemnie. Dla tych studentów, którzy mają wyjątkowo wysoki poziom umiejętności, motywacja nie jest tak istotna dla osiągnięcia sukcesu, podczas gdy dla studentów z najwyższą motywacją, czyste umiejętności nie mają znaczenia. Tutaj powiedzielibyśmy, że całość stanowi mniej niż suma części, występuje częściowy kompromis (trade-off) między umiejętnościami i motywacją jeśli chodzi o przewidywanie osiągnięć akademickich. Druga i trzecia alternatywa stanowi przykład interakcji między predyktorami, to znaczy łącznego efektu predyktorów, który różni się od sumy ich odrębnych efektów.” (s. 255, tłumaczenie niestety własne)
Widzimy zatem, że badanie interakcji może być bardzo przydatną techniką dla każdego badacza, w tym oczywiście także kognitywisty :). Spróbujmy więc w praktyce zademonstrować, jak wygląda w R badanie interakcji i na co trzeba uważać, tworząc modele z interakcjami.
Zbiór danych, na którym będziemy praocwać, dotyczy wynagrodzenia
pracowników akademickich. W kolumnie salary
znajduje się
wysokość rocznego wynagrodzenia. Kolumny yrs.service
oraz
yrs.since.phd
zawierają informacje odpowiednio o stażu w
danej instytucji oraz liczbie lat, która upłynęła od uzyskania stopnia
doktora.
Na początek zobaczmy, jak wyglądają relacje między zmiennymi
yrs.service
i yrs.since.phd
oraz
salary
, kiedy weźmiemy je z osobna. W tym przypadku dobrym
sposobem będzie narysowanie odpowiednich wykresów rozrzutu z nałożonymi
na nie liniami regresji.
Dla wynagrodzenia i lat, które upłynęły od uzyskania stopnia doktora:
library(ggplot2)
ggplot(Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_point() +
geom_smooth(method=lm)
## `geom_smooth()` using formula = 'y ~ x'
Dla wynagrodzenia i stażu:
ggplot(Salaries, aes(x=yrs.service, y=salary)) +
geom_point() +
geom_smooth(method=lm)
## `geom_smooth()` using formula = 'y ~ x'
Widzimy więc, że jeśli rozważamy relacje między każdą zmienną objaśniającą z osobna i zmienną objaśnianą, to są one pozytywne - im wyższy ktoś ma staż, tym więcej zarabia na akademii, im więcej upłynęło od doktoratu, tym zarobki są większe.
Teraz stwórzmy sobie teraz prosty model, w którym predyktorami będą
zmienne yrs.since.phd
(liczba lat, które upłynęły od
uzyskania doktoratu) oraz yrs.service
(staż pracy), a
wartością, którą chcemy przewidywać, będzie oczywiście wynagrodzenie
(wyrażone, jak mam nadzieję, w dolarach rocznie).
fit <- lm(salary ~ yrs.since.phd + yrs.service, data = Salaries)
pander(summary(fit))
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 89912 | 2844 | 31.62 | 3.811e-110 |
yrs.since.phd | 1563 | 256.8 | 6.086 | 2.754e-09 |
yrs.service | -629.1 | 254.5 | -2.472 | 0.01385 |
Observations | Residual Std. Error | \(R^2\) | Adjusted \(R^2\) |
---|---|---|---|
397 | 27357 | 0.1883 | 0.1842 |
Jak widzimy, współczynniki regresji dla obu naszych predyktorów są istotnie różne od \(0\) (dla \(\alpha = 0.05\)). Widzimy również, że kontrolując liczbę lat, które upłynęły od uzyskania doktoratu, relacja między stażem a wynagrodzeniem jest negatywna. Każdy rok stażu zmniejsza (nieznacznie) wynagrodzenie!
Współczynnik \(R^2\) dla naszego modelu wynosi \(0.18\), co jest wartością umiarkowanie wysoką jak na nauki społeczne. Sprawdźmy jeszcze, czy nasze predyktory nie są za bardzo wspóliniowe – mamy podstawy sądzić, że staż oraz lata, które upłynęły od uzyskania tytułu doktora mogą być ze sobą bardzo silnie skorelowane. Jak Państwo pamiętają, możemy w tym wypadku posłużyć się wartością VIF.
pander(vif(fit))
yrs.since.phd | yrs.service |
---|---|
5.796 | 5.796 |
Nasze zmienne objaśniające są do pewnego stopnia współliniowe (VIF w okolicach 6), ale nie jest to jakaś wielka tragedia (szczególnie w przykładzie mającym funkcje przede wszystkim pedagogiczne), więc nie przejmujemy się tym tutaj. Warto jednak mieć tę wartość w pamięci, bo do problemu współliniowości będziemy jeszcze wracać.
Spróbujmy zastanowić się jakie mamy możliwości relacji między stażem, latami od uzyskania doktoratu jako zmiennymi objaśniającymi a wynagrodzeniem. W najprostszym wypadku efekt może być kumulatywny (suma efektów). Gdybyśmy mieli do czynienia z efektami o tym samym znaku, moglibyśmy zaobserwować synergistyczny efekt. W przypadku efektów o przeciwnym znaku moglibyśmy mówić o interakcji buforującej, w której efekty mają przeciwny znak i osłabiają się wzajemnie. Trzecim wzorcem interakcji jest interakcja antagonistyczna, w której oba predyktory wpływają na zmienną objaśnianą w ten sam sposób, ale interakcja ma przeciwny znak.
Zobaczmy, z którym z tych trzech ważnych wzorców mamy do czynienia w
naszym przypadku. W R możemy zadecydować, czy chcemy badać również
interakcje, używają zamiast znaku dodawania (+
) znaku
mnożenia (*
).
fit <- lm(salary ~ yrs.since.phd * yrs.service, data = Salaries)
pander(summary(fit))
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 70155 | 3472 | 20.21 | 9.036e-63 |
yrs.since.phd | 2194 | 246.9 | 8.889 | 2.26e-17 |
yrs.service | 1692 | 356.3 | 4.75 | 2.852e-06 |
yrs.since.phd:yrs.service | -64.62 | 7.487 | -8.63 | 1.537e-16 |
Observations | Residual Std. Error | \(R^2\) | Adjusted \(R^2\) |
---|---|---|---|
397 | 25115 | 0.3177 | 0.3125 |
Zanim przejdziemy do interpretacji interakcji, to, żeby lepiej
uzmysłowić sobie jak działają, spróbujmy ręcznie stworzyć zmienną, która
będzie reprezentowała interakcje tych dwóch czynników W kolumnie
interaction_term
w ramce danych umieścimy iloczyn wartości
z kolumn yrs.since.phd
oraz yrs.service
a
następnie stworzymy model (bez używania *
), który będzie tę
interakcję uwzględniał.
Salaries$interaction_term <- Salaries$yrs.since.phd * Salaries$yrs.service
fit <- lm(salary ~ yrs.since.phd + yrs.service + interaction_term, data = Salaries)
pander(summary(fit))
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 70155 | 3472 | 20.21 | 9.036e-63 |
yrs.since.phd | 2194 | 246.9 | 8.889 | 2.26e-17 |
yrs.service | 1692 | 356.3 | 4.75 | 2.852e-06 |
interaction_term | -64.62 | 7.487 | -8.63 | 1.537e-16 |
Observations | Residual Std. Error | \(R^2\) | Adjusted \(R^2\) |
---|---|---|---|
397 | 25115 | 0.3177 | 0.3125 |
Jak widzimy, uzyskaliśmy takie same wartości dla współczynników
regresji, \(R^2\) oraz taki sam wynik
testów statystycznych. Pokazuje to, że możemy traktować interakcje jako
wprowadzenie do modelu dodatkowej zmiennej, będącej iloczynem tych
zmiennych, których interakcje chcemy zbadać. R ułatwia nam jednak sprawę
i możemy po prostu napisać *
.
Wyświetlmy jeszcze raz podstawowe informacje dotyczącego naszego modelu z interakcją.
fit <- lm(salary ~ yrs.since.phd * yrs.service, data = Salaries)
pander(summary(fit))
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 70155 | 3472 | 20.21 | 9.036e-63 |
yrs.since.phd | 2194 | 246.9 | 8.889 | 2.26e-17 |
yrs.service | 1692 | 356.3 | 4.75 | 2.852e-06 |
yrs.since.phd:yrs.service | -64.62 | 7.487 | -8.63 | 1.537e-16 |
Observations | Residual Std. Error | \(R^2\) | Adjusted \(R^2\) |
---|---|---|---|
397 | 25115 | 0.3177 | 0.3125 |
Jak widzimy mamy w naszym modelu trzy zmienne:
yrs.since.phd
, yrs.service
oraz interakcję
czyli yrs.since.phd:yrs.service
. Dla wszystkich z nich
przekroczyliśmy próg statystycznej istotności. Jak je jednak
zinterpretować? Wprowadzenie interakcji sprawia, że sytuacja się nieco
komplikuje.
Jak pamiętamy, przy wielokrotnej regresji bez interakcji, nie wszystkie transformacje predyktorów wpływały na współczynniki regresji. Możemy to łatwo przetestować. Wycentrujemy sobie nasze predyktory, to znaczy dla każdej zmiennej od każdej wartości odejmijmy średnią dla danej zmiennej. Dzięki temu średnia dla każdego z predyktorów wynosić będzie \(0\).
Salaries$yrs.since.phd_c <- Salaries$yrs.since.phd - mean(Salaries$yrs.since.phd)
Salaries$yrs.service_c <- Salaries$yrs.service - mean(Salaries$yrs.service)
Teraz zobaczmy, czy wycentrowanie zmiennych wpływa na współczynniki regresji przy modelu bez interakcji.
fit_zwykly <- lm(salary ~ yrs.since.phd + yrs.service, data = Salaries)
fit_wycentrowany <- lm(salary ~ yrs.since.phd_c + yrs.service_c, data = Salaries)
pander(summary(fit_zwykly))
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 89912 | 2844 | 31.62 | 3.811e-110 |
yrs.since.phd | 1563 | 256.8 | 6.086 | 2.754e-09 |
yrs.service | -629.1 | 254.5 | -2.472 | 0.01385 |
Observations | Residual Std. Error | \(R^2\) | Adjusted \(R^2\) |
---|---|---|---|
397 | 27357 | 0.1883 | 0.1842 |
pander(summary(fit_wycentrowany))
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 113706 | 1373 | 82.82 | 2.597e-251 |
yrs.since.phd_c | 1563 | 256.8 | 6.086 | 2.754e-09 |
yrs.service_c | -629.1 | 254.5 | -2.472 | 0.01385 |
Observations | Residual Std. Error | \(R^2\) | Adjusted \(R^2\) |
---|---|---|---|
397 | 27357 | 0.1883 | 0.1842 |
Jak widzimy, zmienił się tylko wyraz wolny regresji, podczas gdy współczynniki kierunkowe dla wszystkich predyktorów pozostały te same. Nie powinno nas to dziwić. Co jednak, gdy zrobimy to samo dla modelu z interakcjami?
fit_zwykly <- lm(salary ~ yrs.since.phd * yrs.service, data = Salaries)
fit_wycentrowany <- lm(salary ~ yrs.since.phd_c * yrs.service_c, data = Salaries)
pander(summary(fit_zwykly))
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 70155 | 3472 | 20.21 | 9.036e-63 |
yrs.since.phd | 2194 | 246.9 | 8.889 | 2.26e-17 |
yrs.service | 1692 | 356.3 | 4.75 | 2.852e-06 |
yrs.since.phd:yrs.service | -64.62 | 7.487 | -8.63 | 1.537e-16 |
Observations | Residual Std. Error | \(R^2\) | Adjusted \(R^2\) |
---|---|---|---|
397 | 25115 | 0.3177 | 0.3125 |
pander(summary(fit_wycentrowany))
Estimate | Std. Error | t value | Pr(>|t|) | |
---|---|---|---|---|
(Intercept) | 123533 | 1699 | 72.73 | 4.563e-230 |
yrs.since.phd_c | 1056 | 243 | 4.346 | 1.764e-05 |
yrs.service_c | 250.5 | 254.9 | 0.9829 | 0.3262 |
yrs.since.phd_c:yrs.service_c | -64.62 | 7.487 | -8.63 | 1.537e-16 |
Observations | Residual Std. Error | \(R^2\) | Adjusted \(R^2\) |
---|---|---|---|
397 | 25115 | 0.3177 | 0.3125 |
Widzimy, że stało się coś nieco nieoczekiwanego! Wartość \(R^2\) pozostała taka sama, ale zmieniły się współczynniki regresji, co poskutkowało również zmianą tego, które z nich są statystycznie istotne. Dlaczego tak się stało? Żeby zrozumieć dlaczego wycentrowanie ma w tym wypadku wpływ na współczynniki regresji, musimy najpierw dobrze zrozumieć co one znaczą dla modeli z interakcjami.
Kiedy efekty poszczególnych predyktorów są kumulatywne (tzn. nie mamy modelu z interakcjami), to współczynniki regresji dla każdego z predyktorów jest taki sam niezależnie od wartości innych predyktorów (efekt pierwszego rządu, first order effect). Sytuacja zmienia się jednak kiedy w naszym modelu uwzględniliśmy interakcje. Wówczas współczynniki regresji dla poszczególnych wchodzących w interakcje zmiennych moderowane są przez wartości tych zmiennych, z którymi dana zmienna wchodzi w interakcje.
Upraszczając trochę sprawę możemy powiedzieć, że skutkiem
uwzględnienia w modelu interakcji jest to, że współczynnik regresji dla
yrs.since.phd
będzie różny w zależności od tego, czy
yrs.service
będzie na przykład wynosić 5 czy 15.
Do czego w takim razie odnoszą się wartości z kolumny
Estimate
dla naszych pojedynczych predyktorów? Są to
wartości współczynników regresji dla efektów pierwszego rzędzu kiedy
wartości pozostałych predyktorów wynoszą \(0\). Dlatego właśnie zmieniły się kiedy
wycentrowaliśmy nasze zmienne! \(0\)
wszak oznaczało przed wycentrowaniem zero czegoś (lat pracy, lat stażu),
teraz zaś oznacza średnią w naszej próbie (średnia lat pracy, średnia
stażu). Mamy więc rozwiązanie zagadki!
Teraz możemy więc zinterpretować współczynniki regresji dla poszczególnych predyktorów. Możemy powiedzieć, że dla średniej wartości stażu wyrażonego w latach każdy rok który upłynął od uzyskania tytułu doktora zwiększa średnio wynagrodzenie o 1056 dolarów rocznie!
Dodatkowo możemy wreszcie powiedzieć, z którym wzorcem interakcji z omówionych wcześniej, mamy do czynienia. Oba nasze predyktory działają w tym samym kierunku, ale interakcja ma przeciwny znak. Zinterpretować możemy to tak, że oba rozważane przez nas czynniki (lata pracy i lata od doktoratu) mają pozytywny wpływ na wynagrodzenie, ale wpływ każdego z nich zmniejsza się wraz ze wzrostem drugiego! Dodatkowo warto zauważyć, że nasz model z interakcją ma sporo wyższy \(R^2\) niż model bez interakcji.
Widzimy teraz dlaczego warto centrować nasze predyktory - możemy dzięki temu podać sensowną interpretację współczynników regresji dla efektów pierwszego rzędu. Gdybyśmy tego nie zrobili, to powiedzilibyśmy, że dla wartości stażu wyrażonego w latach równiej zero, każdy rok który upłynął od uzyskania tytułu doktora zwiększa średnio wynagrodzenie o 2194 dolary rocznie. To nie jest zbyt sensowna wartość zważywszy na to, że trudno mieć staż wynoszący 0 lat. Sytuacja wygląda jeszcze bardziej absurdalnie w przypadku takich zmiennych jak wiek, kiedy mówilibyśmy coś o sytuacji, w której ktoś ma 0 lat!
Dodatkowo w przypadku wycentrowania naszych predyktorów możemy zinterpretować współczynniki regresji dla efektów pierwszego rzędu w jeszcze jeden sposób. Reprezentują one wówcza średni efekt danego predyktora w całym zakresie danego predyktora, co jest raczej bliższe temu, jak interpretujemy te współczynniki w modelu bez interakcji. Ponadto, kiedy rozważamy średni efekt danego predyktora, łatwiej nam zinterpretować wynik testu statystycznego. Gdybyśmy nie wycentrowali predyktorów, to testy statystyczne odnosiłyby się do efektów pierwszego rzędu dla wartości pozostałych predyktorów (w rozważanej interakcji) równej 0.
Generalnie rzecz biorąc podręczniki zajmujące się regresją rekomendują w takich wypadkach centrowanie predyktorów za wyjątkiem sytuacji, kiedy wartość 0 ma jakąś interesującą interpretacje w odniesieniu do tego, co nasza zmienna mierzy.
Centrowanie zmiennych ma jeszcze jedną zaletę - pozwala wyeliminować do pewnego stopnia współliniowość zmiennych z modelu. Porównajmy wartości VIF dla zmiennych wycentrowanych i niewycentrowanych.
pander(vif(fit_wycentrowany))
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
yrs.since.phd_c | yrs.service_c | yrs.since.phd_c:yrs.service_c |
---|---|---|
6.155 | 6.899 | 1.317 |
pander(vif(fit_zwykly))
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
yrs.since.phd | yrs.service | yrs.since.phd:yrs.service |
---|---|---|
6.354 | 13.48 | 13.01 |
Widzimy. że centrując zmienne udało nam się wyeliminować pewną część współliniowości, co należy uznać za pozytyw jeśli chodzi o wiarygodność naszego modelu.
Interakcje między zmiennymi można z powodzeniem zwizualizować. Dzięki
przedstawieniu tej relacji na wykresie, łatwiej uświadomić sobie co tak
naprawdę znaczą poszczególne liczby i jakie ma to przełożenie na relacje
między zmiennymi. W pakiecie interactions
znajduje się
sporo narzędzi do analizy interakcji oraz ich wizualizacji. My
skorzystamy z dostępnej w nim funkcji interact_plot
.
Funkcja jako pierwszy argument przyjmuje model, który stworzyliśmy za
pomocą funkcji lm
, przekażemy jej również dwa dodatkowe
argumenty - którą zmienną na użytek wykresu chcemy potraktować jako
predyktor, a którą jako moderator. My chcemy dowiedzieć się, jak zmienia
się relacja między wynagrodzeniami a czasem, który upłynął od uzyskania
doktoratu wraz ze zmianą stażu zatrudnienia.
library(interactions)
interact_plot(fit_wycentrowany,
pred = yrs.since.phd_c,
modx = yrs.service_c)
Jak widzimy funkcja interact_plot
wybrała domyślnie 3
poziomy naszego moderatora (yrs.service_c
), dla których na
wykres nałożona jest linia regresji. Są to: średnia, -1 odchylenie
standardowe od średniej oraz +1 odchylenie standardowe od średniej.
Widzimy teraz na czym polega moderowanie efektu pierwszego rzędu dla
jednej zmiennej przez wartość drugiej zmiennej. Wraz ze wzrostem
wartości naszego moderatora (stażu), linia regresji jest coraz bardziej
pozioma.
Wykres tworzony za pomocą interact_plot
możemy
dostosowywać do swoich potrzeb. Poniżej znajduje się przykład, gdzie
oprócz linii regresji dla trzech poziomów yrs.service_c
nanieśliśmy na wykres również punkty (wykres rozrzutu).
interact_plot(fit_wycentrowany,
pred = yrs.since.phd_c,
modx = yrs.service_c,
plot.points = TRUE, point.shape = TRUE)
Na pewno zadali sobie Państwo pytanie, jak obliczyć wartość
współczynnika regresji dla różnych wartości zmiennej moderującej w danej
interakcji. Można to dość łatwo zrobić na piechotę (jak? to już zadanie
do zastanowienia się dla Państwa!), ale funkcja sim_slopes
z pakietu interactions
zrobi to za nas (nawet umie sama
centrować zmienne!).
W przypadku, gdy interesują nas wartości dla średniej, +1 odchylenia
standardowego i -1 odchylenia standardowego używamy jej bardzo podobne
jak interact_plot
.
sim_slopes(fit_zwykly,
pred = yrs.since.phd,
modx = yrs.service)
## JOHNSON-NEYMAN INTERVAL
##
## When yrs.service is OUTSIDE the interval [25.90, 44.67], the slope of
## yrs.since.phd is p < .05.
##
## Note: The range of observed values of yrs.service is [0.00, 60.00]
##
## SIMPLE SLOPES ANALYSIS
##
## Slope of yrs.since.phd when yrs.service = 4.608586 (- 1 SD):
##
## Est. S.E. t val. p
## --------- -------- -------- ------
## 1896.50 238.92 7.94 0.00
##
## Slope of yrs.since.phd when yrs.service = 17.614610 (Mean):
##
## Est. S.E. t val. p
## --------- -------- -------- ------
## 1056.09 242.98 4.35 0.00
##
## Slope of yrs.since.phd when yrs.service = 30.620633 (+ 1 SD):
##
## Est. S.E. t val. p
## -------- -------- -------- ------
## 215.68 282.76 0.76 0.45
Jeżeli interesują nas jakieś specyficzne wartości moderatora, to
możemy je przekazać w argumencie modx.values
. Dla przykładu
wybrałem wartości yrs.service
równe 5, 30 i 55, a
sim_slopes
obliczyła współczynniki regresji dla
yrs.since.phd
oraz przeprowadziła dla nich test
statystyczny (\(H_0: B = 0\), czyli czy
dany współczynnik jest statystycznie różny od 0).
sim_slopes(fit_zwykly,
pred = yrs.since.phd,
modx = yrs.service,
modx.values = c(5,30,55))
## JOHNSON-NEYMAN INTERVAL
##
## When yrs.service is OUTSIDE the interval [25.90, 44.67], the slope of
## yrs.since.phd is p < .05.
##
## Note: The range of observed values of yrs.service is [0.00, 60.00]
##
## SIMPLE SLOPES ANALYSIS
##
## Slope of yrs.since.phd when yrs.service = 5.00:
##
## Est. S.E. t val. p
## --------- -------- -------- ------
## 1871.20 238.46 7.85 0.00
##
## Slope of yrs.since.phd when yrs.service = 30.00:
##
## Est. S.E. t val. p
## -------- -------- -------- ------
## 255.78 280.23 0.91 0.36
##
## Slope of yrs.since.phd when yrs.service = 55.00:
##
## Est. S.E. t val. p
## ---------- -------- -------- ------
## -1359.64 412.63 -3.30 0.00