2010-11-28 5 views
2

숫자가있는 행렬 (크기 : 28 열 47 행)이 있습니다. 이 행렬에는 열 머리글 ("ordinal"및 "nominal")이 포함 된 추가 행이 있습니다.Gower 거리 함수 구현

이 행렬에 Gower 거리 함수를 사용하고 싶습니다.

i 번째와 j 번째의 단위 사이의 최종 차이도가 각 변수에 대한 비 유사성의 가중 합으로서 얻어진다 : Here가 있다고 특히

d(i,j) = sum_k(delta_ijk * d_ijk)/sum_k(delta_ijk) 

, d_ijk i 번째와 j 번째까지의 거리를 나타낸다 단위는 k 번째 변수를 고려하여 계산됩니다. 그것은 변수의 특성에 따라 달라집니다

  • 인자 또는 문자 열이 범주 명목 변수로 간주하고 d_ijk = 0

    경우

    x_ik = x_jk, 1, 그렇지 않으면

  • 명령 열 범주 순서 변수와
    값이 계수 레벨에
    대응 위치 인덱스 r_ik 치환으로 간주된다./-합니다 (R 함수 순위의 출력 다르다)이 위치
    인덱스는 다음과 같이

z_ik = (1 r_ik)로 변환
이다 (최대 (r_ik) - 1)

이러한 새 값 z_ik는
간격 조정 변수의 관측 값으로 처리됩니다.

한국인 중량 delta_ijk 관한 같이

  • delta_ijk = 0이 x_ik NA = 또는 = x_jk NA;
  • delta_ijk = 1입니다.

나는 gower.dist 기능이 있음을 알고 있지만 그렇게해야합니다. 그래서 "d_ijk", "delta_ijk"및 "z_ik"에 대해 더 나은 방법을 찾지 못해 기능을 만들려고했습니다.

나는 "delta_ijk"로 시작하고 난이 시도 :

Delta=function(i,j){for (i in 1:28){for (j in 1:47){ 
+{if (MyHeader[i,j]=="nominal") 
+ result=0 
+{else if (MyHeader[i,j]=="ordinal") result=1}}}} 
+;result} 

을하지만 오류가 발생했습니다. 그래서 나는 붙어있어 나머지는 할 수 없어.

P. 실례지만 실수하면 영어가 자주 사용되는 언어가 아닙니다.

+1

zip 또는 tar.gz 파일로 데이터를 다시 게시 할 수 있습니까? 내 리눅스 박스는 rar 아카이브를 열지 않고 어떤 응용 프로그램을 열 것인지를 알기위한 길이로 나간다. 그렇게한다면 기꺼이 볼 수 있습니다. –

답변

0

논리가 무엇인지 잘 모르겠지만 자신의 이익을 위해 너무 많은 "{"를 넣고 있습니다.일반적으로 {} 쌍을 사용하여 consequent-clause를 둘러 쌉니다.

Delta=function(i,j){for (i in 1:28) {for (j in 1:47){ 
     if (MyHeader[i,j]=="nominal") { 
     result=0 
    # the "{" in the next line before else was sabotaging your efforts 
     } else if (MyHeader[i,j]=="ordinal") { result=1} } 
     result} 
        } 
3

왜 휠 빌트를 재발 명하고 싶습니까? R과 함께 제공되는 패키지 클러스터의 daisy()을 포함하여 R을 계산할 여러 함수/패키지가 있습니다.

첫 번째 사항은 먼저 데이터에서 해당 데이터 유형 헤더를 가져옵니다. 이것이 정말로 행렬이면,이 헤더 행의 문자 정보는 전체 행렬을 문자 행렬로 만듭니다. 데이터 프레임이면 모든 열이 요인이 될 수 있습니다. 원하는 것은 각 열 (데이터 프레임의 구성 요소)에있는 데이터 형식을 'factor' 또는 'ordered'으로 코딩하는 것입니다.

df <- data.frame(A = c("ordinal",1:3), B = c("nominal","A","B","A"), 
       C = c("nominal",1,2,1)) 

이렇게하면 추가 정보로 인해 모든 요소가 요소로 저장됩니다.

> head(df) 
     A  B  C 
1 ordinal nominal nominal 
2  1  A  1 
3  2  B  2 
4  3  A  1 
> str(df) 
'data.frame': 4 obs. of 3 variables: 
$ A: Factor w/ 4 levels "1","2","3","ordinal": 4 1 2 3 
$ B: Factor w/ 3 levels "A","B","nominal": 3 1 2 1 
$ C: Factor w/ 3 levels "1","2","nominal": 3 1 2 1 

첫 번째 행을 제거하고 올바른 형식으로 다시 코딩하면 Gower의 계수를 쉽게 계산할 수 있습니다.

> gower.dist(DF) 
      [,1]  [,2]  [,3] 
[1,] 0.0000000 0.8333333 0.3333333 
[2,] 0.8333333 0.0000000 0.8333333 
[3,] 0.3333333 0.8333333 0.0000000 

당신은 이런 식으로 할 수없는 말 : (비록 약간 다른 형식 (as.matrix(daisy(DF))) 상응하는 것에서)이 데이터를 gower.dist()와 동일하게 제공

> headers <- df[1,] 
> df <- df[-1,] 
> DF <- transform(df, A = ordered(A), B = factor(B), C = factor(C)) 
> ## We've previously shown you how to do this (above line) for lots of columns! 
> str(DF) 
'data.frame': 3 obs. of 3 variables: 
$ A: Ord.factor w/ 3 levels "1"<"2"<"3": 1 2 3 
$ B: Factor w/ 2 levels "A","B": 1 2 1 
$ C: Factor w/ 2 levels "1","2": 1 2 1 
> require(cluster) 
> daisy(DF) 
Dissimilarities : 
      2   3 
3 0.8333333   
4 0.3333333 0.8333333 

Metric : mixed ; Types = O, N, N 
Number of objects : 3 

? 왜 안되는지 설명해 주시겠습니까? 다른 사람들이 이미 당신을 위해 코딩 한 것을하려는 노력의 어느 정도 가려고하는 것처럼 보입니다. 숙제가 아니야?

+0

먼저 Gavin과 Dwin에게 감사의 말을 전합니다. 나는 "gower.dist"함수를 사용하고 "daisy()"함수도 사용했다. 두 번째 변수는 숫자 변수를 모두 만들었 기 때문에 두 번째 변수가 마음에 들지 않았고 각 함수마다 다른 결과를 얻었다. 내가하려는 것은 이미 완료된 것을 다시 시도하는 것이지만, 나는 달리 할 수 ​​없다는 것을 알고 있습니다. 연구를 위해 R. – billyt

+0

을 사용하여이 작업을 수행해야합니다.이 동료는 검증을 위해 Matlab을 사용했습니다. Matlab에는 Gower 거리 계수가 준비되어 있지 않기 때문에 첫 번째 게시물에 게시 한 함수를 사용하여 구현했습니다. 그녀의 코드는 괜찮습니다. 숫자 코드에서 코드와 "gower.dist"함수를 테스트했을 때 정확히 같은 행렬을 얻었 기 때문입니다. 그러나이 데이터를 사용하여 순서화 된 열과 인수를 명목상의 열을 다시 코딩해야하므로 다른 결과가 나타납니다. 나는 너 자신 그것을 시험하기 위하여 자료 및 나의 결과를 여기에서 올려주기했다 (http://www.mediafire.com/?nx25hzxcmvq998o). 나는 너를 괴롭히는 것에 유감이다. – billyt

+0

@bilyt : 데이터를 숫자로 변환하는 daisy()에 대해 ** 잘못된 ** 일은 없습니다. 'daisy()'는 몇 년 동안 R에 속해 있었으며, 동료 Matlab 코드보다 더 많은 눈을 쏟아 부었습니다. –

0

도움을 주신 Gavin 및 DWin에게 감사드립니다. 나는 문제를 해결하고 올바른 거리 매트릭스를 찾을 수 있었다. 데이터 클래스를 다시 코딩 한 후에 데이지()를 사용했습니다.

P. 열의 클래스를 변경하는 다른 주제에서 제안한 해결책은 다음과 같습니다.

DF$nominal <- as.factor(DF$nominal) 
DF$ordinal <- as.ordered(DF$ordinal) 

이 작동하지 않았습니다. 최초의 명목상과 서수상 만 바뀌었다.

다시 도움 주셔서 감사합니다.