2017-02-14 3 views
2

3 개의 변수 (x1, x2, x3)에 대해 3 가지 효과 크기를 계산하고 싶습니다. 다음 데이터 집합이 있다고 가정합니다.데이터 세트의 변수 세트에 대한 3 그룹 간의 효과 크기 계산

set.seed(1234) 

data <- data.frame(
    dose=factor(c(rep(1,25), rep(2,35), rep(3,40)), 
     labels = c("low", "middle", "high")), 
    x1 = rnorm(100, 0, 2), 
    x2 = rnorm(100, 3, 3), 
    x3 = rnorm(100, 9, 4) 
) 

이제 각 처리 조합에 대해 효과 크기를 계산하고 싶습니다. 나는 코헨의 d를 계산하는이 함수를 발견했다.

cohens_d <- function(x, y) { 
    lx <- length(x)- 1 
    ly <- length(y)- 1 
    md <- abs(mean(x) - mean(y)) 
    csd <- lx * var(x) + ly * var(y) 
    csd <- csd/(lx + ly) 
    csd <- sqrt(csd) 

    cd <- md/csd 
    # Hedges'g 
    cd*(1-(3/(4*(length(x)+length(y)-9)))) 
    #print(cd) 

} 

감사합니다.

EDIT 예 :

, I는 하나 개의 변수 (X1)의 3 개 처리 (페어)의 효과의 크기를 계산할 수 이하이다. 이상적으로는, 내 데이터 집합의 모든 변수에 대해 이러한 쌍으로 된 비교를 얻을 수있는 일반적인 방법을 원합니다.

cohens_d(data$x1[data$dose=="low"], data$x1[data$dose=="middle"]) 
cohens_d(data$x1[data$dose=="low"], data$x1[data$dose=="high"]) 
cohens_d(data$x1[data$dose=="middle"], data$x1[data$dose=="high"]) 

답변

2
이 데이터
df1$dose <- as.character(df1$dose) # convert dose from factor to character 
selected_cols <- colnames(df1)[2:4] # select columns prefixed with 'x' 

library("reshape2") # load reshape2 library 
df1 <- melt(data = df1, id = "dose", measure.vars =selected_cols , value.name = 'value') # melt df1 data frame 

# compute cohensD  
cohens_df1 <- with(df1, sapply(selected_cols, # loop through column names 
           function(x) combn(unique(dose), 2 , # loop through pairs of dose combinations 
                function(y) cohens_d(df1[ variable %in% x & dose %in% y[1], 'value' ], 
                      df1[ variable %in% x & dose %in% y[2], 'value' ])))) 

# assign row names 
rownames(cohens_df1) <- combn(unique(df1$dose), 2 , function(y) paste(y, collapse = '_')) 
cohens_df1 
#     x1   x2   x3 
# low_middle 0.3319591 0.09511378 0.321519422 
# low_high 0.4982017 0.03265765 0.337651450 
# middle_high 0.8221889 0.10799662 0.006570862 

:

set.seed(1234)  
df1 <- data.frame(dose = factor(c(rep(1,25), rep(2,35), rep(3,40)), levels = c(1, 2, 3), labels = c("low", "middle", "high")), 
        x1 = rnorm(100, 0, 2), 
        x2 = rnorm(100, 3, 3), 
        x3 = rnorm(100, 9, 4)) 
+1

것은 내 편집을 참조, 내가 선택한 COLS – Sathish

+0

에 변수의 목록을 변경하면, 모든 42 열 이름에 대한 특정 패턴이 있습니까 예를 들어 그들이 번호입니다 1에서 42까지의 접두사와 x? – Sathish

+0

감사합니다. 실수로 더 일반화 된 코드를 요청한 주석을 삭제했습니다. 나는 당신의 편집이 완벽하다고 믿습니다. 또한,'selected_cols' 대신에'measure.vars = c ('x1', 'x2', 'x3')'를 사용했던 이전 버전에서는'dput (names (data) '모든 것이 더 쉬워진다. –

관련 문제