حساب الارتباط - cor () - لمجموعة فرعية فقط من الأعمدة

StackOverflow https://stackoverflow.com/questions/3571909

  •  01-10-2019
  •  | 
  •  

سؤال

لديّ بيانات بيانات وأرغب في حساب علاقه مترابطه (مع Spearman ، البيانات فئوية ومرتبة) ولكن فقط لمجموعة فرعية من الأعمدة. حاولت مع كل شيء ، لكن R's كور() تقبل الوظيفة فقط البيانات العددية (يجب أن تكون x رقمية ، كما تقول رسالة الخطأ) ، حتى لو تم استخدام Spearman.

تتمثل إحدى الأساليب الغاشمة في حذف الأعمدة غير العادية من DataFrame. هذا ليس أنيقًا ، بالنسبة للسرعة ، ما زلت لا أريد حساب الارتباطات بين الكل الأعمدة.

آمل أن تكون هناك طريقة لقول ببساطة "حساب الارتباطات للأعمدة X و Y و Z". يمكن أن المراجع العمود حسب الرقم أو بالاسم. أفترض أن الطريقة المرنة لتزويدهم ستكون من خلال ناقل.

أي اقتراحات موضع تقدير.

هل كانت مفيدة؟

المحلول

إذا كان لديك بيانات بيانات حيث تكون بعض الأعمدة رقمية وبعضها آخر (حرف أو عامل) وتريد فقط القيام بالارتباطات للأعمدة الرقمية ، فيمكنك القيام بما يلي:

set.seed(10)

x = as.data.frame(matrix(rnorm(100), ncol = 10))
x$L1 = letters[1:10]
x$L2 = letters[11:20]

cor(x)

Error in cor(x) : 'x' must be numeric

لكن

cor(x[sapply(x, is.numeric)])

             V1         V2          V3          V4          V5          V6          V7
V1   1.00000000  0.3025766 -0.22473884 -0.72468776  0.18890578  0.14466161  0.05325308
V2   0.30257657  1.0000000 -0.27871430 -0.29075170  0.16095258  0.10538468 -0.15008158
V3  -0.22473884 -0.2787143  1.00000000 -0.22644156  0.07276013 -0.35725182 -0.05859479
V4  -0.72468776 -0.2907517 -0.22644156  1.00000000 -0.19305921  0.16948333 -0.01025698
V5   0.18890578  0.1609526  0.07276013 -0.19305921  1.00000000  0.07339531 -0.31837954
V6   0.14466161  0.1053847 -0.35725182  0.16948333  0.07339531  1.00000000  0.02514081
V7   0.05325308 -0.1500816 -0.05859479 -0.01025698 -0.31837954  0.02514081  1.00000000
V8   0.44705527  0.1698571  0.39970105 -0.42461411  0.63951574  0.23065830 -0.28967977
V9   0.21006372 -0.4418132 -0.18623823 -0.25272860  0.15921890  0.36182579 -0.18437981
V10  0.02326108  0.4618036 -0.25205899 -0.05117037  0.02408278  0.47630138 -0.38592733
              V8           V9         V10
V1   0.447055266  0.210063724  0.02326108
V2   0.169857120 -0.441813231  0.46180357
V3   0.399701054 -0.186238233 -0.25205899
V4  -0.424614107 -0.252728595 -0.05117037
V5   0.639515737  0.159218895  0.02408278
V6   0.230658298  0.361825786  0.47630138
V7  -0.289679766 -0.184379813 -0.38592733
V8   1.000000000  0.001023392  0.11436143
V9   0.001023392  1.000000000  0.15301699
V10  0.114361431  0.153016985  1.00000000

نصائح أخرى

للبيانات العددية لديك الحل. لكنها بيانات قاطعة ، قلت. ثم تصبح الحياة أكثر تعقيدًا ...

حسنًا ، أولاً: لا يتم قياس مقدار الارتباط بين متغيرين قاطعين مع ارتباط رتبة سبيرمان ، ولكن مع اختبار chi-square على سبيل المثال. وهو المنطق في الواقع. الترتيب يعني أن هناك بعض الطلبات في بياناتك. أخبرني الآن ما هو أكبر ، أصفر أم أحمر؟ أعلم أنه في بعض الأحيان يقوم R بإجراء ارتباط رتبة سبيرمان على البيانات الفئوية. إذا كنت رمز الأصفر 1 والأحمر 2 ، فإن R تعتبر أحمر أكبر من الأصفر.

لذلك ، ننسى Spearman للبيانات الفئوية. سأوضح اختبار Chisq وكيفية اختيار الأعمدة باستخدام Combn (). لكنك ستستفيد من المزيد من الوقت مع كتاب Agresti:http://www.amazon.com/categorical-analysis-wiley-probability-statistics/dp/0471360937

set.seed(1234)
X <- rep(c("A","B"),20)
Y <- sample(c("C","D"),40,replace=T)

table(X,Y)
chisq.test(table(X,Y),correct=F)
# I don't use Yates continuity correction

#Let's make a matrix with tons of columns

Data <- as.data.frame(
          matrix(
            sample(letters[1:3],2000,replace=T),
            ncol=25
          )
        )

# You want to select which columns to use
columns <- c(3,7,11,24)
vars <- names(Data)[columns]

# say you need to know which ones are associated with each other.
out <-  apply( combn(columns,2),2,function(x){
          chisq.test(table(Data[,x[1]],Data[,x[2]]),correct=F)$p.value
        })

out <- cbind(as.data.frame(t(combn(vars,2))),out)

ثم يجب أن تحصل على:

> out
   V1  V2       out
1  V3  V7 0.8116733
2  V3 V11 0.1096903
3  V3 V24 0.1653670
4  V7 V11 0.3629871
5  V7 V24 0.4947797
6 V11 V24 0.7259321

حيث يشير V1 و V2 بين المتغيرات التي يذهب إليها ، و "خارج" يعطي قيمة p للترابط. هنا جميع المتغيرات مستقلة. الذي تتوقعه ، حيث قمت بإنشاء البيانات بشكل عشوائي.

لقد وجدت طريقة أسهل من خلال النظر إلى البرنامج النصي الذي تم إنشاؤه بواسطة حشرجة الموت. يبدو أدناه:

correlations <- cor(mydata[,c(1,3,5:87,89:90,94:98)], use="pairwise", method="spearman")

خيار آخر هو مجرد استخدام الممتاز corrr حزمة https://github.com/drsimonj/corrr وافعل

require(corrr)
require(dplyr)

myData %>% 
   select(x,y,z) %>%  # or do negative or range selections here
   correlate() %>%
   rearrange() %>%  # rearrange by correlations
   shave() # Shave off the upper triangle for a cleaner result

الخطوتين 3 و 4 اختياريين تمامًا ويتم تضمينهما فقط لإثبات فائدة الحزمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top