기타통계이야기/통계프로그램 S-plus소개

R 프로그래밍3

학위논문통계 2024. 7. 2. 16:56

이왕 나온 김에 제 작업을 위해 미리 짜논 몇 개 함수를 소개하겠습니다.

 

모두 급하게 짠다고 해서 그리 잘 짠 프로그램은 아닙니다.

 

 

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;

}