حساب الارتباط - cor () - لمجموعة فرعية فقط من الأعمدة
-
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 اختياريين تمامًا ويتم تضمينهما فقط لإثبات فائدة الحزمة.