2012-11-15 3 views
1

설문 조사 패키지를 사용하여 변수를 통해 문제를 반복하고 있습니다. 설문 조사 가중치와 함께 데이터 프레임에 수집하는 변수의 하위 집합이 있고 카이 제곱 검정을 수행하려고한다고 가정 해 봅시다. 여러 테스트의 문제점을 염두에두고 모든 고유 한 조합을 테스트하고 싶습니다. 이것은 R에서 일반적으로 비교적 직관적이며, 좋은 예가 here입니다.R 설문 조사 패키지의 루핑 통과

아쉽게도 조사 항목에서 항목이 디자인 객체에 있어야하기 때문에 더 어려워지고, 가장 중요한 것은 데이터 집합 색인이 지원되지 않는다는 것입니다 (적어도 아는 한). 위에서 언급 한 예제를 svychisq에 적용하려고 시도했지만 모든 전략이 실패했습니다.

누군가가 비슷한 here을했음을 알았지 만 대부분의 변수는 고정되어 있습니다. 누구든지 함수를 만들 수 있을까요 (this 어쩌면 비슷한 대답) svychisq 함수를 사용하여? 불행히도 저는 온라인에서 사용할 수있는 많은 범주 형 변수와 복잡한 디자인을 가진 데이터 집합을 알지 못합니다. 데모의 목적을 위해 내가 어떤 도움을 크게 감상 할 수

library(survey) 
data(api) 
dclus1<-svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc) 
svychisq(~sch.wide+stype, dclus1) 

처음 10 개 변수를 통해 루프 기능 도움말 파일 및 시도와 같이 하나의 데이터 (API)에 dclus1 사용할 수도있을 것 같군요.

업데이트 : 제가 정말로하려고하는 것은 변수 이름을 지정하지 않고 대신 변수 조합을 제공하는 것입니다. 예 :

MyChi2tests <- apply(combn(colnames(apiclus1[,c(2,16:17)]),2), 2, function(z) paste(z, collapse = '+')) 

답변

4
library(survey) 
data(api) 
dclus1<-svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc) 

# run a simple example svychisq() function 
svychisq(~sch.wide+stype , dclus1) 

# create a function that requires a character string (containing the variables) 
# and the design object and runs the svychisq() 
# on the contents of that character string's columns 
scsloop <- function(vars , design){ svychisq(as.formula(paste0("~" , vars)) , design) } 

# test it out 
scsloop("sch.wide+stype" , dclus1) 
scsloop("sch.wide+comp.imp" , dclus1) 

# either create a character vector to run it multiple times 
cols.to.chisq <- c("sch.wide" , "comp.imp" , "stype") 

# or identify them based on column number, if you prefer 
cols.to.chisq <- names(apiclus1)[ c(2 , 16 , 17) ] 


# find every combination of that vector, taken two at a time 
combos <- combn(cols.to.chisq , 2) 

# separate them by + 
col.combos <- paste(combos[ 1 , ] , combos[ 2 , ] , sep = "+") 

# run it on each of those character strings (print to screen and save to list) 
(x <- lapply(col.combos , scsloop , dclus1)) 

# just for kicks, print everything to the screen 
col.combos[1] ; x[[1]] 
col.combos[2] ; x[[2]] 
col.combos[3] ; x[[3]] 
+0

감사합니다! 단 하나. 내 목표는 모든 고유 변수 조합을 하나의 벡터에 넣는 것입니다 (그렇지 않으면 쌍을 나열하는 것은 원래 함수로 수행하는 것과 거의 같습니다). 변수 2,16과 17. 다음과 같이 cols.to.chisq를 자동으로 만들려고 할 때 : cols.to.chisq <- apply (combn (colnames (apiclus1 [, c (2) , 16 : 17)]), 2), 2, function (z) paste (z, collapse = '+')) 위와 같이 lapply에서 실행하면 오류가 발생합니다. as.integer (.margins)의 오류 : 'closure'유형을 'integer'유형의 벡터에 강제 변환 할 수 없습니다. – maycobra

+0

# 내 대답을 편집했습니다. 그게 필요한 것 같아요? 하지만 당신의 코드를 실행할 때 .. cols.to.chisq <- (combn (colicames (apiclus1 [, c (2,16 : 17)]), 2), 2, function (z) 붕괴 = '+')) # 다음 lapply 내 scsloop 기능을 사용하여 lapply (cols.to.chisq, scsloop, dclus1)가 나를 위해 잘 작동 .. # : –

+0

아마 내 실수. 다시 한 번 감사드립니다. – maycobra