2016-08-09 3 views
-1

이 질문에 대해 미리 사과드립니다. 나는 도움을 구하는 것이 매우 유용한 정보를 산출하지 못하도록하기 위해 노력하고있는 것을 모호하게 이해하고 있습니다.300 명의 사용자에 대한 상관 관계 실행 및 중요한 상관 관계를 기반으로하는 부분 집합

본질적으로 제 질문은 이것입니다. 나는 서로 지출 카테고리 "옷"사이에 어떤 상관 관계가 있는지보고 싶어

hh_ids  date income consumption alcohol cleaning_materials clothing 
1 KELDK01 2012-11-1 62.70588 40.52941  0   0.000000 0.000000 
2 KELDK01 2012-12-1 17.64706 42.43530  0   1.058824 7.058824 
3 KELDK01 2013-01-1 91.76471 48.23529  0   0.000000 0.000000 
4 KELDK01 2013-02-1 91.76470 107.52940  0   0.000000 0.000000 
5 KELDK01 2013-03-1 116.47060 114.47060  0   0.000000 0.000000 
6 KELDK01 2013-04-1 124.41180 118.29410  0   2.705882 17.647060 
7 KELDK01 2013-05-1 137.23530 105.00000  0   1.411765 1.882353 
8 KELDK01 2013-06-1 131.52940 109.54120  0   4.352942 2.941176 
9 KELDK01 2013-07-1 121.52940 113.47060  0   2.352941 25.882350 
10 KELDK01 2013-08-1 123.32940 86.50588  0   2.588235 2.941176 

: 나는 300 hh_ids 각각 12 행, 각 달 하나, 다음과 같습니다 데이터 프레임을 가지고 1 년 동안 각 가구에 대한 지출 범주 (약 10). 그런 다음 "의류"와 다른 지출 범주간에 중요한 상관 관계가있는 가구만으로 새로운 데이터 프레임을 만들고 싶습니다.

이 문제를 어떻게 해결할 수 있을지에 대한 의견이 있으십니까?

(ps 내가 "의류"와 다른 지출 카테고리 간의 교차 제품 대체인지 ​​확인하고 해당 행동을 보여주는 HH를 분리하려고합니다. 내가 바보 인 경우 더 좋은 방법은 내가 당신의 생각을 듣고 드리겠습니다, 그것을 할 수 있습니다)

편집 :! 요청에 대한 응답으로 지금까지 작업을 볼 수 : 것을 생각 그것 오히려 당황하지만 난 manually-에 해왔습니다 나는 그것을 제대로하는 방법을 알아내는 동등한 시간을 보내고 싶다.

df_cloth에서 df를 하위 집합으로 지정합니다 (연도 중에 옷감이 0보다 큰 가구의 경우). 이는 140HH입니다.

나는 다음 않았다 :

df_cloth_cor<-select(df_cloth,income,consumption,alcohol,cleaning_material, clothing) 
cor(df_cloth_cor) 

나는 다음과 상관 관계가 각 변수 천에 대한 열, 가정에서 Excel에서 상관 계수를 기록했다.

+0

지금까지 시도한 것을 보여 주시겠습니까? – shayaa

답변

2

예제를 변경하여 2 개의 다른 ID를 포함 시켰습니다. 또한 "중요한 상관 관계"가 무슨 뜻인지 잘 모르겠습니다. 큰 가치, 또는 통계적으로 유의합니까? 두 경우 모두 여기에 포함 시켰습니다.

1 상관 값과 p 값

library(dplyr) 

# example dataset 
dt = read.table(text="hh_ids  date income consumption alcohol cleaning_materials clothing 
       KELDK01 2012-11-1 62.70588 40.52941  0   0.000000 0.000000 
       KELDK01 2012-12-1 17.64706 42.43530  0   1.058824 7.058824 
       KELDK01 2013-01-1 91.76471 48.23529  0   0.000000 0.000000 
       KELDK01 2013-02-1 91.76470 107.52940  0   0.000000 0.000000 
       KELDK01 2013-03-1 116.47060 114.47060  0   0.000000 0.000000 
       KELDK01 2013-04-1 124.41180 118.29410  0   2.705882 17.647060 
       KELDK02 2013-05-1 137.23530 105.00000  0   1.411765 1.882353 
       KELDK02 2013-06-1 131.52940 109.54120  0   4.352942 2.941176 
       KELDK02 2013-07-1 121.52940 113.47060  0   2.352941 25.882350 
       KELDK02 2013-08-1 123.32940 86.50588  0   2.588235 2.941176", 
       sep="", header=T, stringsAsFactors = F) 

dt 

#  hh_ids  date income consumption alcohol cleaning_materials clothing 
# 1 KELDK01 2012-11-1 62.70588 40.52941  0   0.000000 0.000000 
# 2 KELDK01 2012-12-1 17.64706 42.43530  0   1.058824 7.058824 
# 3 KELDK01 2013-01-1 91.76471 48.23529  0   0.000000 0.000000 
# 4 KELDK01 2013-02-1 91.76470 107.52940  0   0.000000 0.000000 
# 5 KELDK01 2013-03-1 116.47060 114.47060  0   0.000000 0.000000 
# 6 KELDK01 2013-04-1 124.41180 118.29410  0   2.705882 17.647060 
# 7 KELDK02 2013-05-1 137.23530 105.00000  0   1.411765 1.882353 
# 8 KELDK02 2013-06-1 131.52940 109.54120  0   4.352942 2.941176 
# 9 KELDK02 2013-07-1 121.52940 113.47060  0   2.352941 25.882350 
# 10 KELDK02 2013-08-1 123.32940 86.50588  0   2.588235 2.941176 


# create a function that calculates correlation and p value given 2 vectors 
Get_cor_and_pval = function(d,n1,n2,id){ 

    # create 2 vectors based on names of variables and the id 
    x = d[,n1][dt$hh_ids==id] 
    y = d[,n2][dt$hh_ids==id] 

    # calculate correlation and p value 
    test = cor.test(x,y) 
    c = test$estimate # keep correlation value 
    p = test$p.value # keep p value 

    return(data.frame(c = c, p = p, row.names = NULL)) 
} 


# specify combinations of variables to calculate correlation 
names1 = "clothing" 
names2 = c("income","consumption","alcohol","cleaning_materials") 

dt_combs = expand.grid(names1=names1, names2=names2, stringsAsFactors = F) 

dt_combs 

#  names1    names2 
# 1 clothing    income 
# 2 clothing  consumption 
# 3 clothing   alcohol 
# 4 clothing cleaning_materials 


# process to get correlations and p values for each variable combination and each id 
dt %>% 
    select(hh_ids) %>% distinct() %>%          # select unique ids 
    group_by(hh_ids) %>%             # for each id 
    do(data.frame(.,dt_combs)) %>%           # get all combinations of interest 
    rowwise() %>%               # for each id and combination 
    do(data.frame(.,              # keep id and combination 
       Get_cor_and_pval(dt,.$names1,.$names2,.$hh_ids),   # get correlation and p value 
       stringsAsFactors=F)) %>%         # factor variables as character 
    ungroup()                # forget groupings 

# # A tibble: 8 x 5 
# hh_ids names1    names2   c   p 
# * <chr> <fctr>    <chr>  <dbl>  <dbl> 
# 1 KELDK01 clothing    income 0.1713298 7.455198e-01 
# 2 KELDK01 clothing  consumption 0.3220463 5.336309e-01 
# 3 KELDK01 clothing   alcohol   NA   NA 
# 4 KELDK01 clothing cleaning_materials 0.9999636 1.989337e-09 
# 5 KELDK02 clothing    income -0.6526867 3.473133e-01 
# 6 KELDK02 clothing  consumption 0.5376850 4.623150e-01 
# 7 KELDK02 clothing   alcohol   NA   NA 
# 8 KELDK02 clothing cleaning_materials -0.1416633 8.583367e-01 

마지막 데이터 프레임이 각 ID에 대한 관심의 모든 쌍 사이의 상관 관계가 무엇인지를 보여줍니다. 알코올 변수는 항상 0이며이 NA 값을 만듭니다. 자신 만의 필터를 사용하여 원하는 행을 유지할 수 있습니다.

300 개의 ID와 6 개의 변수에 대해서는 잘 작동합니다. 훨씬 많은 수의 ID (수백만) 및 많은 변수의 경우 속도가 느려지고 더 효율적인 방법이있을 수 있습니다.

2.상관 값 경우

그냥 상관 값이 아닌 P 값의 관심은, 다음 코드는 훨씬 짧은 :

library(dplyr) 

# example dataset 
dt = read.table(text="hh_ids  date income consumption alcohol cleaning_materials clothing 
       KELDK01 2012-11-1 62.70588 40.52941  0   0.000000 0.000000 
       KELDK01 2012-12-1 17.64706 42.43530  0   1.058824 7.058824 
       KELDK01 2013-01-1 91.76471 48.23529  0   0.000000 0.000000 
       KELDK01 2013-02-1 91.76470 107.52940  0   0.000000 0.000000 
       KELDK01 2013-03-1 116.47060 114.47060  0   0.000000 0.000000 
       KELDK01 2013-04-1 124.41180 118.29410  0   2.705882 17.647060 
       KELDK02 2013-05-1 137.23530 105.00000  0   1.411765 1.882353 
       KELDK02 2013-06-1 131.52940 109.54120  0   4.352942 2.941176 
       KELDK02 2013-07-1 121.52940 113.47060  0   2.352941 25.882350 
       KELDK02 2013-08-1 123.32940 86.50588  0   2.588235 2.941176", 
       sep="", header=T, stringsAsFactors = F) 


dt %>% 
    group_by(hh_ids) %>%     # for each id 
    do(data.frame(cor(.[,3:7]))[5,]) %>% # keep columns 3 to 7 (numeric columns), get the correlation matrix and keep row 5 (row for income and all other) 
    ungroup() 

# # A tibble: 2 x 6 
# hh_ids  income consumption alcohol cleaning_materials clothing 
#  <chr>  <dbl>  <dbl> <dbl>    <dbl> <dbl> 
# 1 KELDK01 0.1713298 0.3220463  NA   0.9999636  1 
# 2 KELDK02 -0.6526867 0.5376850  NA   -0.1416633  1 

뿐만 아니라

corrr 패키지를 사용하여 대안
library(dplyr) 
library(corrr) 

# example dataset 
dt = read.table(text="hh_ids  date income consumption alcohol cleaning_materials clothing 
       KELDK01 2012-11-1 62.70588 40.52941  0   0.000000 0.000000 
       KELDK01 2012-12-1 17.64706 42.43530  0   1.058824 7.058824 
       KELDK01 2013-01-1 91.76471 48.23529  0   0.000000 0.000000 
       KELDK01 2013-02-1 91.76470 107.52940  0   0.000000 0.000000 
       KELDK01 2013-03-1 116.47060 114.47060  0   0.000000 0.000000 
       KELDK01 2013-04-1 124.41180 118.29410  0   2.705882 17.647060 
       KELDK02 2013-05-1 137.23530 105.00000  0   1.411765 1.882353 
       KELDK02 2013-06-1 131.52940 109.54120  0   4.352942 2.941176 
       KELDK02 2013-07-1 121.52940 113.47060  0   2.352941 25.882350 
       KELDK02 2013-08-1 123.32940 86.50588  0   2.588235 2.941176", 
       sep="", header=T, stringsAsFactors = F) 


dt %>% 
    group_by(hh_ids) %>%        # for each id 
    do(correlate(.[,3:7]) %>% focus(clothing)) %>% # keep columns 3 to 7, get correlations but return ones that have to do with variable "clothing" 
    ungroup() 

# # A tibble: 8 x 3 
# hh_ids   rowname clothing 
#  <chr>    <chr>  <dbl> 
# 1 KELDK01    income 0.1713298 
# 2 KELDK01  consumption 0.3220463 
# 3 KELDK01   alcohol   NA 
# 4 KELDK01 cleaning_materials 0.9999636 
# 5 KELDK02    income -0.6526867 
# 6 KELDK02  consumption 0.5376850 
# 7 KELDK02   alcohol   NA 
# 8 KELDK02 cleaning_materials -0.1416633 
+0

나는 후속 질문을 할 수 있기를 바랬다. 위의 옵션 1을 사용하여 데이터 (739 개의 관측치)의 하위 집합에 대해 시도한 결과 "cor.test.default (x, y)의 오류 : 한정된 관측치가 충분하지 않습니다"오류가 표시됩니다. 데이터를 확인하고 NA 값이 없습니다. 아무것도 제안 할 수 있니? –

+0

일부 변수에 대해 고유 값이 거의 없을 수 있습니다. 이 문제를 일으키는 변수 쌍을 확인하십시오. – AntoniosK