이왕 나온 김에 제 작업을 위해 미리 짜논 몇 개 함수를 소개하겠습니다.
모두 급하게 짠다고 해서 그리 잘 짠 프로그램은 아닙니다.
1. ave
구조방정식의 확인적 요인분석에서 AVE 값과 CR 값을 요구하는 경우가 있습니다. 이 값은 AMOS에서 구해 주지 않습니다. 시중에서 구조방정식 책을 사서 거기 공식에 맞춰 계산을 해야 합니다.
AMOS 최근 버전에서는 구해 주는지는 잘 모르겠습니다.
하여간
ave<-function(data){
nr<-dim(data)[1];
nc<-dim(data)[2];
mat<-matrix(NA,nc,2);
for (j in 1:nc){
a<-(sum(abs(data[,j])))^2;
b<-sum(1-data[,j]^2);
cr<-a/(a+b);
mat[j,1]<-cr;
f<-sum(data[,j]^2);
g<-sum(1-data[,j]^2);
ave<-f/(f+g);
mat[j,2]<-ave;
}
mat;
}
여기서 data는 확인적 요인분석 결과에서 나온 회귀계수와 표준오차를 말합니다. 이 함수가 최종적으로 return 하는 값은 mat이라는 matrix 형태의 값, 즉 mat[,1]에는 cr 값, mat[,2]에는 ave 값이 들어 있습니다.
2. 기술통계
보시면 금방 이해하실 수 있습니다. 단지 결과물이 논문 작업에 바로 집어넣을 수 있도록, 즉 복사, 붙이기 해서 논문에 바로 삽입될 수 있도록 했습니다.
msd<-function(data,vari){
nr<-length(vari);
nc<-2;
mat<-matrix(NA,nr,5);
mat[,1]<-apply(data[,vari],2,min, na.rm=T);
mat[,2]<-apply(data[,vari],2,max, na.rm=T);
mat[,3]<-apply(data[,vari],2,mean, na.rm=T);
mat[,4]<-sqrt(apply(data[,vari],2,var, na.method="omit"));
mat[,5]<-(nr+1)-rank(mat[,3]);
mat;
}
3. 교차분석
교차분석은 분산분석과 함께 가장 초보적인 분석인데 지금은 잘 안하는 것 같습니다. 특히 한때 한류에 대한 관심이 많아져서 이 쪽은 교차분석이나 분산분석 하기에 딱 좋은 분야이거든요.
하여간 문제는 spss에서 결과물을 우리가 원하는 방향이 아닌 반대 방향의 결과물을 보여줍니다.
예를 들어 설문에
“한국 문화에서 가장 좋아하는 장르는” 질문에
1) 드라마 2) 영화 3) 팝 4) 음식 5) 기타
이렇게 조사되었다면 SPSS에서는 성별로 조사 문항을 쭉 다 조사하고, 그 다음 연령별로 조사문항을 다 조사하고 이런 식으로 결과을 보여줍니다.
그러나 우리가 원하는 결과물 형태는
성별에서, 연령별에서, 학력별에서, 결혼 여부에 따라서, 국적에 따라서 K 문화 선호가 어떻게 다른지 보고 싶다는 것이죠. 즉 그래서 표는
구분 | 분류 | 드라마 | 영화 | 팝 | 음식 | 기타 | X2 |
성별 | 남자 | 27 | 48 | 58.411** |
|||
(11.34%) | (19.34%) | ||||||
여자 | |||||||
연령별 | 20대 미만 | 118.454*** | |||||
20-30대 ... |
|||||||
학력 | 대졸 미만 | 11.546* | |||||
대졸 | |||||||
대학원 이상 |
|||||||
즉, 하나의 연구변수에 성별, 연령별, 학력별 등 등 인구통계 변인별로 교차분석한 결과를 보여주는 것입니다.
SPSS에서는 이렇게 되지를 않고 성별로 모든 연구변수 분석하고 그 다음에 연령별로 모든 변수 분석하고 이런 식으로 결과물을 보여 줍니다.
제가 만든 R 프로그램입니다.
mycross<-function(data,vari,group, pro=1){
rowsum<-0;
for (j in 1:length(group)){
row<-sum(!is.na(unique(data[,group[j]])));
rowsum<-rowsum+2*row;
}
rowsum<-rowsum+3;
cross<-vector("list",length(vari));
for (i in 1:length(vari)){
col<-sum(!is.na(unique(data[,vari[i]])));
tb<-matrix(NA,rowsum,col+2);
freq<-table(data[,vari[i]]);
tb[1,1:col]<-as.integer(names(freq));
glevelsum<-1;
for (j in 1:length(group)){
glevel<-sum(!is.na(unique(data[,group[j]])));
temptb<-table(data[,group[j]],data[,vari[i]]);
temptb<-temptb[,dimnames(temptb)[[2]]!="NA"];
if (j ==1){
tottemp<-temptb;
totmarginal<-apply(temptb,1,sum);
}
marginalsum<-apply(temptb,pro,sum);
if(pro==1){
temptb.prob<-(temptb/marginalsum)*100;
}
else{
temptb.prob<-t((t(temptb)/marginalsum)*100);
}
for (k in 1:glevel){
tb[glevelsum+2*k-1,1:col]<-temptb[k,];
tb[glevelsum+2*k,1:col]<-temptb.prob[k,];
if (k==1){
chi<-chisq.test(as.factor(data[,vari[i]]),as.factor(data[,group[j]]),correct=F);
tb[glevelsum+2*k-1,col+1]<-chi[[1]];
tb[glevelsum+2*k-1,col+2]<-chi[[3]];
}
}
glevelsum<-glevelsum+2*glevel;
}
tot<-apply(tottemp,2,sum);
tot.prob<-tot/sum(tot)*100;
tb[glevelsum+1,1:col]<-tot;
tb[glevelsum+2,1:col]<-tot.prob;
cross[[i]]<-tb;
}
for (i in 1:length(vari)){
mat<-cross[[i]];
ra<-dim(mat)[1];
ca<-dim(mat)[2];
mat[2:rowsum,1:(ca-2)]<-round(mat[2:rowsum,1:(ca-2)],1);
mat[2:rowsum,c(ca-1,ca)]<-round(mat[2:rowsum,c(ca-1,ca)],3);
mat<-apply(mat,2,as.character);
for ( j in seq(3,ra,2)){
mat[j,1:(ca-2)]<-paste("(",mat[j,1:(ca-2)],")",sep="");
}
cross[[i]]<-mat;
}
cross;
}
4. 조절효과를 위한 이진더미변수
조절효과를 보기 위해서 인구통계 변인을 이진더미변수로 전환해야 합니다.
예를 들어 학력 변수가 1=고졸이하, 2=대졸, 3=대학원이상 이렇게 코딩되어 있다고 하죠.
이 경우 SPSS에서 처리하는 방법이 있습니다.
1) 일반선형모형에 가서 연구모형에 따라 학력변수를 처리하는 방법입니다. 이 경우 본인이 직접 학력변수를 이진더미변수로 만들 필요도 없고 상호작용항을 직접 만들 필요도 없습니다.
2) SPSS데이타에서 본인이 직접 이진더미변수를 만드는 것입니다. 하는 방법은 다음과 같습니다. 일단 준거범주를 정합니다. 고졸학력을 준거범주로 하면 고졸=(0, 0) 이렇게 코딩되고 대졸=(1, 0), 대학원 졸=(0, 1) 이렇게 코딩됩니다. 그럼 SPSS 데이타를 한번 보죠.
학력 | 학력더미1 | 학력더미2 | 이진학력더미1 | 이진학력더미2 |
1 | 1 | 1 | 0 | 0 |
3 | 3 | 3 | 0 | 1 |
3 | 3 | 3 | 0 | 1 |
2 | 2 | 2 | 1 | 0 |
2 | 2 | 2 | 1 | 0 |
1 | 1 | 1 | 0 | 0 |
2 | 2 | 2 | 1 | 0 |
학력이라는 변수 옆에 2개의 칸을 첨가한 다음 그래도 복사, 붙이기 한 다음 학력더미1 변수는 대졸=1, 고졸과 대학원졸=0, 학력더미2는 대학원졸=1, 고졸과 대졸=0으로 변환하면 원하는 이진더미변수로 만들 수 있습니다.
다음은 제가 만든 R 코드입니다. 아주 옛날에 만들었기 때문에 조금 수정을 해야 할지 모르겠습니다.
todummy3<-function(data,var){
dat<-data[,var];
r<-length(dat);
dum<-matrix(NA,r,2);
for( i in 1:r){
if(!is.na(dat)[i] && dat[i]==1)
dum[i,]<-c(1,0);
else if(!is.na(dat)[i] && dat[i]==2)
dum[i,]<-c(0,1);
else if(!is.na(dat)[i] && dat[i]==3)
dum[i,]<-c(0,0);
else
dum[i,]<-c(NA,NA);
}
data<-cbind(data,dum);
data;
}
'기타통계이야기 > 통계프로그램 S-plus소개' 카테고리의 다른 글
하루에 R하나 정도는:simulation으로 중심극한정리 증명 (0) | 2024.07.13 |
---|---|
R프로그램: 필독 (0) | 2024.07.05 |
R 프로그래밍2 (1) | 2024.07.01 |
R 프로그래밍1 (0) | 2024.06.29 |
통계프로그램 , S-plus 소개 (0) | 2013.05.06 |