Menu

מתאם ב-R: cor(), cor.test() ומטריצות מתאם

מדדו כמה שני משתנים נעים יחד עם cor(), בדקו אם הקשר אמיתי עם cor.test(), וסרקו משתנים רבים בבת אחת בעזרת מטריצת מתאם.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

מתאם בין שני משתנים: cor()

מתאם שואל: כשמשתנה אחד עולה, האם השני נוטה לעלות גם הוא (חיובי), לרדת (שלילי), או לעשות מה שבא לו (קרוב לאפס)? ב-R זו קריאה אחת:

התשובה היא בערך −0.87: מכוניות כבדות יותר צורכות יותר דלק, והקשר חזק. המספר הבודד הזה הוא מקדם המתאם של Pearson, שנכתב תמיד r.

איך קוראים את r

המקדם תמיד נופל בין −1 ל-+1. הסימן נותן את הכיוון; הגודל נותן את העוצמה:

| |r| | פירוש מקובל | | --- | --- | | 0.0 עד 0.2 | זניח | | 0.2 עד 0.4 | חלש | | 0.4 עד 0.6 | בינוני | | 0.6 עד 0.8 | חזק | | 0.8 עד 1.0 | חזק מאוד |

התייחסו לטווחים האלה כנקודת פתיחה לשיחה, לא כחוק: בפיזיקה r של 0.6 הוא אכזבה, בפסיכולוגיה הוא שיא של קריירה. שתי תכונות שכדאי להפנים: ל-r אין יחידות (מתאם בין משקל בטונות ל-mpg נותן את אותו r כמו משקל בקילוגרמים מול mpg, כי r מחושב על ערכים מתוקננים), ו-r מודד רק קשר לינארי: קשר מושלם בצורת U יכול להיות עם r ≈ 0.

והמשפט שחייבים לומר: מתאם אינו סיבתיות. מכירות גלידה ומקרי טביעה נמצאים במתאם חזק לאורך חודשי השנה, לא כי גלידה מטביעה אנשים, אלא כי הקיץ מניע את שניהם. מתאם אומר לכם ששני משתנים נעים יחד; הוא שותק לגבי הלמה. אולי x מניע את y, אולי y מניע את x, אולי משהו שלישי (העונה, במקרה הזה) מניע את שניהם. כדי להכריע ביניהם צריך ניסויים או חשיבה סיבתית זהירה, לא r גדול יותר.

Spearman ו-Kendall: כש-Pearson הוא הכלי הלא נכון

Pearson עובד על הערכים הגולמיים, ולכן הוא רגיש לחריגים ועיוור לקשרים מעוקלים. הארגומנט method עובר לחלופות מבוססות דירוג:

Spearman מחליף כל ערך בדירוג שלו ואז מחשב Pearson על הדירוגים. מכיוון ש-y תמיד עולה כש-x עולה, כל הדירוגים מסתדרים ו-Spearman מדווח בדיוק 1: הגודל של החריג מפסיק להיות חשוב, רק המיקום שלו. פנו ל-Spearman כשהנתונים סודרים (סולמות בסקרים), מוטים מאוד, או כשהקשר מונוטוני אבל לא ישר. Kendall עונה על שאלה דומה בעזרת זוגות תואמים ולא תואמים; הוא עמיד יותר במדגמים קטנים אבל איטי יותר, ו-Spearman הוא ברירת המחדל הנפוצה.

מטריצת המתאם

כדי לסרוק קשרים בין משתנים רבים בבת אחת, העבירו ל-cor() כמה עמודות מספריות:

כל משתנה מול כל משתנה אחר, עם 1 באלכסון (כל דבר נמצא במתאם מושלם עם עצמו) ותמונת מראה משני צדיו. עיגול לשתי ספרות אחרי הנקודה חשוב יותר ממה שנשמע: המטריצה הלא מעוגלת היא קיר של ספרות, וכל הטעם במטריצה הוא לסרוק אותה. כאן הסריקה מראה ש-mpg נמצא במתאם שלילי עם שלושתם (מכוניות כבדות, חזקות ועם מנוע גדול שורפות יותר דלק), ואילו wt, hp ו-disp כולם במתאם חיובי חזק זה עם זה: אשכול של משתני "מכונית גדולה" שיהיה חשוב כשתגיעו לרגרסיה לינארית ולכאבי הראש של המולטיקולינאריות.

ערכים חסרים: הארגומנט use

כשיש נתונים חסרים, ברירת המחדל של cor() היא להחזיר NA במקום לנחש:

  • use = "complete.obs" משמיט כל שורה שמכילה NA כלשהו, ואז מחשב את כל המטריצה מהשורות שנשארו. עקבי, אבל בזבזני: wt חסר מסיר את השורה הזו גם מהזוג mpg ו-hp.
  • use = "pairwise.complete.obs" מחשב כל תא מכל השורות שבהן הזוג הזה קיים. הוא שומר יותר נתונים, אבל תאים שונים נשענים על תת-קבוצות שונות, ולעיתים נדירות מאוד זה יכול לייצר מטריצה שאינה עקבית פנימית.

לכמה NA בודדים כל אחד מהם בסדר; רק ציינו באיזה השתמשתם.

האם זה מובהק? cor.test()

cor() נותנת מספר אבל שום תחושה אם הוא יכול להיות רעש. cor.test() מריצה את מבחן ההשערות:

עברו על הפלט חלק אחר חלק:

  • t = −9.56, df = 30: סטטיסטי המבחן. השערת האפס היא שהמתאם האמיתי הוא אפס; ה-r שנצפה מומר לסטטיסטי t עם n − 2 דרגות חופש (32 מכוניות − 2).
  • p-value = 1.29e-10: אם המתאם האמיתי היה אפס, ההסתברות לראות r רחוק כל כך מאפס במדגם של 32 היא בערך 0.0000000001. זו ראיה מכרעת שהקשר אמיתי, אבל זכרו: ערך ה-p מדבר על השאלה אם r שונה מאפס, לא על השאלה אם הקשר גדול או סיבתי.
  • 95 percent confidence interval: −0.93 to −0.74: הטווח הסביר של המתאם האמיתי. לעיתים קרובות שימושי יותר מערך ה-p: אפילו הקצה האופטימי של הרווח הזה הוא מתאם שלילי חזק.
  • sample estimates: cor = −0.87: אותו מספר ש-cor() נתנה לכם.

למדגמים קטנים מגיע כאן כבוד מיוחד: עם n = 10, מתאמים של ±0.5 מופיעים במקרה לעיתים קרובות באופן מדאיג, ורווח הסמך הרחב יגיד לכם את זה. דווחו על הרווח, לא רק על ערך ה-p.

לראות את זה: תמיד לשרטט

מקדם מתאם דוחס קשר שלם למספר אחד, והדחיסה יכולה להסתיר עקמומיות, אשכולות או נקודה אחת שעושה את כל העבודה. לפני שאתם סומכים על r כלשהו, הסתכלו על תרשים הפיזור:

plot(mtcars$wt, mtcars$mpg)              # one pair
pairs(mtcars[, c("mpg", "wt", "hp", "disp")])  # every pair in the matrix

pairs() מצייר רשת של תרשימי פיזור שתואמת את מטריצת המתאם שלכם: הדרך המהירה ביותר לבדוק שהמספרים אומרים את מה שאתם חושבים. לגרפיקה מלוטשת של מטריצה בסגנון מפת חום, החבילה corrplot (install.packages("corrplot"), ואז corrplot(cor(m))) היא הכלי הסטנדרטי.

מה לקחת מכאן

  • cor(x, y) נותנת את r של Pearson: הסימן הוא הכיוון, הגודל הוא העוצמה, תמיד בטווח [−1, 1], בלי יחידות.
  • מתאם מודד תנועה משותפת לינארית ולא אומר דבר על סיבתיות: משתנה שלישי נסתר הוא תמיד מועמד.
  • method = "spearman" לדירוגים: נתונים סודרים, חריגים, קשרים מונוטוניים אבל מעוקלים.
  • cor(df) על עמודות מספריות נותנת את המטריצה; עגלו אותה עם round(, 2), ושימו לב לארגומנט use = כשיש נתונים חסרים.
  • cor.test(x, y) מוסיפה את ערך ה-p ורווח סמך: דווחו על הרווח.
  • תמיד הסתכלו על תרשים הפיזור לפני שאתם מאמינים למספר.

הבא בתור: כשהשאלה מתחדדת מ"האם הם נעים יחד?" ל"האם הממוצע של הקבוצה הזו שונה מהממוצע של זו?", מבחן t.

שאלות נפוצות

איך מחשבים מתאם ב-R?

cor(x, y) מחזירה את מקדם המתאם של Pearson בין שני וקטורים מספריים. העבירו במקום זאת data frame של עמודות מספריות, cor(df), כדי לקבל את מטריצת המתאם המלאה. לערך p ולרווח סמך, השתמשו ב-cor.test(x, y).

איך מקבלים את ערך ה-p של מתאם ב-R?

cor() לבדה לא נותנת אותו: השתמשו ב-cor.test(x, y). הפלט שלה כולל את סטטיסטי t, דרגות החופש, ערך ה-p עבור השערת האפס שהמתאם האמיתי הוא אפס, רווח סמך של 95% והמקדם המשוער.

מה ההבדל בין מתאם Pearson למתאם Spearman?

Pearson (ברירת המחדל) מודד קשר לינארי על הערכים הגולמיים. Spearman מדרג את הערכים קודם, ולכן הוא מודד אם הקשר עולה או יורד בעקביות (מונוטוני), והוא הרבה פחות רגיש לחריגים. השתמשו ב-cor(x, y, method = "spearman") לנתונים סודרים, לנתונים מוטים או לקשרים מעוקלים אבל מונוטוניים.

איך מטפלים בערכי NA ב-cor()?

כברירת מחדל cor() מחזירה NA אם ערך כלשהו חסר. העבירו use = "complete.obs" כדי להשמיט קודם שורות עם ערך חסר כלשהו, או use = "pairwise.complete.obs" במטריצה כדי להשתמש, עבור כל זוג משתנים, בכל השורות שבהן שניהם קיימים.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל