আর: গ্রুপ অনুসারে গুনে পারস্পরিক সম্পর্ক


17

আর-তে আমার কাছে একটি ক্লাস লেবেল সি (একটি ফ্যাক্টর) এবং দুটি পরিমাপ, এম 1 এবং এম 2 সমন্বিত একটি ডেটা ফ্রেম রয়েছে । আমি প্রতিটি ক্লাসের মধ্যে এম 1 এবং এম 2 এর মধ্যে পারস্পরিক সম্পর্ক কীভাবে গণনা করব ?

আদর্শভাবে, আমি প্রতিটি বর্গ এবং দুটি কলামের জন্য একটি সারি সহ একটি ডেটা ফ্রেম ফিরে পেয়েছিলাম: ক্লাস লেবেল সি এবং পারস্পরিক সম্পর্ক।

উত্তর:


20

প্যাকেজ প্লাইর যাওয়ার উপায়।

এখানে একটি সহজ সমাধান:

xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )
head(xx)

require(plyr)
func <- function(xx)
{
return(data.frame(COR = cor(xx$a, xx$b)))
}

ddply(xx, .(group), func)

আউটপুটটি হবে:

  group         COR
1     1  0.05152923
2     2 -0.15066838
3     3 -0.04717481
4     4  0.07899114

1
(+1) চমৎকার plyrপ্যাকেজ, তাই না? :)
chl

এটি দুর্দান্ত কাজ করে। প্লাইর প্যাকেজটি নির্দেশ করার জন্য ধন্যবাদ! আপনি দয়া করে "। (গ্রুপ)" সিনট্যাক্স ব্যাখ্যা করতে পারেন?
এনপিই

2
আইস - নিশ্চিত এর অর্থ "এর মধ্যে ভেরিয়েবল দ্বারা ডেটা বিভক্ত করুন) (), এবং প্রতিটি উপসেটে ফাংশন সম্পাদন করে"। এটিতে আরও ভেরিয়েবল অন্তর্ভুক্ত করার জন্য আপনার এই বাক্য গঠনটি কেবল ব্যবহার করা উচিত: (var1, var2, var3)। যা আপনার ডাটা 1 কে ভের 1, ভের 2 এবং ভার 3 এর স্তরের সমন্বয় করে কাটা দেওয়ার মতো। এবং প্রতিটি ফাংশন আপনার ফাংশন সম্পাদন করতে। এই প্যাকেজটি হ্যাডলি (ggplot2 এর লেখক) দ্বারাও রক্ষণাবেক্ষণ করা হয়, তাই আমার বিশ্বাস এটি বিকাশ করে চলেছে।
তাল গ্যালি

2
ওহ, এবং বিটিডাব্লু, আপনি বেশ কয়েকটি কোর (প্রায় স্বয়ংক্রিয়ভাবে) এর উপর সমান্তরাল কম্পিউটিং সহ প্লাইয়ারটিও ব্যবহার করতে পারেন, দেখুন: r-statistics.com/2010/09/…
তাল

1
এটি একটি দুর্দান্ত উত্তর, তবে আমি অবাক হয়েছি এর কোনও অন্তর্নিহিত সমাধান নেই, কর (x, y, বাই = জেড) এর মতো কিছু এতটা স্বজ্ঞাত হবে ...
ওয়াল্ডির লিওনসিও

12

যদি আপনি বেস প্যাকেজে ফাংশনগুলি ব্যবহার করতে ঝোঁক হন তবে আপনি ফাংশনটি ব্যবহার করতে পারেন by, তারপরে ডেটাটি পুনরায় সংযুক্ত করুন:

xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )
head(xx)

# This returns a "by" object
result <- by(xx[,2:3], xx$group, function(x) {cor(x$a, x$b)})

# You get pretty close to what you want if you coerce it into a data frame via a matrix
result.dataframe <- as.data.frame(as.matrix(result))

# Add the group column from the row names
result.dataframe$C <- rownames(result)

1
সুন্দর ধন্যবাদ! আমি পরীক্ষা-নিরীক্ষা করেছি by, তবে কীভাবে ফলাফলকে ডেটা ফ্রেমে রূপান্তর করতে হবে তা অনুভব করতে পারিনি।
এনপিই

9

বেস প্যাকেজ এবং তালের উদাহরণ ডেটা ব্যবহার করে অন্য একটি উদাহরণ:

DataCov <- do.call( rbind, lapply( split(xx, xx$group),
             function(x) data.frame(group=x$group[1], mCov=cov(x$a, x$b)) ) )

মার্জিত সমাধান জোশিউ। আপনি কি মনে করেন যে এমন কিছু মামলা রয়েছে যখন একটি সমাধান আরও ভাল হয়?
তাল গ্যালি

2
আমি মনে করি এটি অগ্রাধিকারের বিষয়। আমার উদাহরণটি মূলত যা plyrকরে তা তা কিন্তু এটি আপনাকে সূক্ষ্ম নিয়ন্ত্রণ দেয় যদিও এটি প্রায় পরিষ্কার নয়। যদি একটি সমাধানের আরও ভাল সময় / মেমরি প্রোফাইল থাকে তবে আমার অভিমত পরিবর্তন হবে। আমি যদিও তাদের তুলনা করি না।
জোশুয়া উলরিখ

এই কীভাবে পারস্পরিক সম্পর্ক ফিরে আসে?

2

ডেটা.ট্যাবল ব্যবহার ডিপিপ্লায়ারের চেয়ে কম

dt <- data.table(xx)
dtCor <- dt[, .(mCor = cor(M1,M2)), by=C]

0

এখানে একটি অনুরূপ পদ্ধতি যা আপনাকে প্রতিটি পারস্পরিক সম্পর্কের জন্য এন এর এবং পি মানগুলির সাথে একটি সারণী দেয় (সুবিধার জন্য 3 দশমিক স্থানে গোল করে):

library(Hmisc)
corrByGroup <- function(xx){
  return(data.frame(cbind(correl = round(rcorr(xx$a, xx$b)$r[1,2], digits=3),
                          n = rcorr(xx$a, xx$b)$n[1,2],
                          pvalue = round(rcorr(xx$a, xx$b)$P[1,2], digits=3))))
}

0

dplyrপ্যাকেজটি ব্যবহার করে একটি আরও আধুনিক সমাধান এখানে দেওয়া হয়েছে (যখন প্রশ্ন জিজ্ঞাসা করার সময় এখনও উপস্থিত ছিল না):

ইনপুটটি তৈরি করুন:

xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )

পারস্পরিক সম্পর্ক গণনা:

library(dplyr)
xx %>%
  group_by(group) %>%
  summarize(COR=cor(a,b))

আউটপুট:

Source: local data frame [4 x 2]

  group         COR
  (int)       (dbl)
1     1  0.05112400
2     2  0.14203033
3     3 -0.02334135
4     4  0.10626273
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.