トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

SNA_ind

  • 個人レベルでの分析
  • いつものように行列データを読み込む
library(sna)
load(file="0Mat.rda") 
dim(Mat)
#[1] 1067 1067 と出力されたはず 1067人×1067人の行列
m<- Mat[1:50,1:50] #一部のみとりだす
m
gplot(m,label=rownames(m))  #一部のみを社会ネットワークとして描画
  • 入次数、出次数
#次数を計算  自分でrowSumsしなくてもsnaパッケージには定義されている
in.d<-degree(m,cmode="indegree") #入次数 その人が受けたコメントの数
out.d<-degree(m,cmode="outdegree") #出次数 その人が発したコメントの数
in.out.d<-degree(m,cmode="freeman") #入出次数 その人が受けたコメントの数
data.frame(rownames(m),in.d,out.d,in.out.d)
    • 練習  この値が大きい人はネットワークのどこにいるかを確認
  • 媒介中心性 その人 を介して何組のペアがつながっているか?
btw<-betweenness(m) 
btw<-data.frame(rownames(m),btw)#名前ラベルをつける
btw[order(btw$btw),]  #小さい順に並び替える
    • 練習  この値が大きい人はネットワークのどこにいるかを確認
  • 情報中心性
inf<-infocent(m)
inf<-data.frame(rownames(m),inf)#名前ラベルをつける
inf[order(inf$inf),]  #小さい順に並び替える
    • 練習  この値が大きい人はネットワークのどこにいるかを確認
  • 制約 constraints 構造空隙にどれくらい直面しているか?
  • これを計算するためのルーチン この部分をコピー、Rにペースト
sthole2<-function(A,valued=F){
	A0<-A	#isoloateは除いたりするのでオリジナルを保存しておく
	diag(A)<-0			#対角項は意味無し
		if(valued){
			x<-max(A,na.rm=T)
				A<-A/x
				print("valued graph was normarlized")
					}
	#isolateは除く
	isolates.A<-isolates(A)

if(length(isolates.A)==dim(A)[1]) {		#すべてisolateのとき
	print("***********isolate のみ***********")
	cisolates<-as.data.frame(rownames(A0))	#それらについては名前のみ入れて各	種のものはNAにする
	cisolates$Constraint<-NA
	names(cisolates)[1]<- "memnam" 
	Index.indv<-cisolates

}else{
	if(length(isolates.A)>0){
		A<-A[-c(isolates.A),-c(isolates.A)]	#それを除いた行列
	print(paste("もとの行列の大きさ",dim(A0),"isolate",length(isolates.A),"isolateを除いた行列の大き さ",dim(A)))	

	print(isolates.A)#isolateされている者の番号

	cisolates<-as.data.frame(rownames(A0)[isolates.A])	#それらについては名前のみ入れて各	種のものは NAにする
	cisolates$Constraint<-NA
	names(cisolates)[1]<- "memnam" 
	}
#-----isolates以外について
	AtA<-A+t(A)
	dA<-AtA
	dA[AtA>0]<-1	#dychotomize	直接の結びつきがあるもののみ計算
	N.primary<-rowSums(dA)
	Saijaji<-rowSums(AtA,na.rm = T)	#Σj(aij+aji)
	mxaijaji<-apply(AtA,1,max)		#max(aij+aji)
	M<-AtA/mxaijaji
	P<-AtA/Saijaji

#結んでいる相手のみ 加算する
#Borgattiの修正式  http://www.analytictech.com/connections/v20(1)/holes.htm
	PP<-P%*%P
	diag(PP)<-0		#としないとNAになる
#結んでいる相手のみ 加算する
	PP2<-P+PP*dA
	#dyadic constraints
	Dyadconstraint<-PP2*PP2
		diag(Dyadconstraint)<-0
	Constraint<-rowSums(Dyadconstraint,na.rm = T)
		Constraint0<-sum(Constraint)/dim(A)[1]

#各データをデータフレームに
	if(length(colnames(A))>0)  	memnam<-colnames(A) else memnam<-seq(1:dim(A)[1])
	Index.indv<-data.frame(memnam,Constraint)
	if(length(isolates.A)>0){
		Index.indv<-rbind(Index.indv,cisolates)	#isolatesについてはすべて0に
		}
}
row.names(Index.indv)<-Index.indv$memnam
#だれともつながっていないisolate はConstraintが NAなので フラグをたてて、constraint2では1に
Index.indv$fg.isolete<-0
 Index.indv$fg.isolete[is.na(Index.indv$Constraint)]<-1 
Index.indv$Constraint2<-Index.indv$Constraint
Index.indv$Constraint2[is.na(Index.indv$Constraint)]<-1
return(Index.indv)
}
  • これを読んで計算させる
sth<-sthole2(m)
sth
#この値が小さいほど構造的空隙(ネットワークの狭間)に存在している。だれともつながっていないisolateの場合には 欠損 NAになっている。
  • 練習  この値が小さい人はネットワークのどこにいるかを確認
  • これらをデータフレームにまとめる
ind.dat<-data.frame(rownames(m),in.d,out.d,in.out.d,btw$btw,inf$inf,sth$Constraint,sth$Constraint2,sth$fg.isolete)
 ind.dat
#一列目の変数=idを除いてプロット
plot(  ind.dat[,-1])
#相関係数
cor(  ind.dat[,-1]) 
                       in.d       out.d    in.out.d    btw.btw     inf.inf sth.Constraint sth.Constraint2 sth.fg.isolete
in.d             1.00000000  0.97312571  0.99237569  0.6750603 0.549127231             NA     -0.04749009   -0.026908345
out.d            0.97312571  1.00000000  0.99408757  0.7837395 0.539003459             NA     -0.07977041   -0.036875830
in.out.d         0.99237569  0.99408757  1.00000000  0.7377918 0.547420571             NA     -0.06508848   -0.032425127
btw.btw          0.67506028  0.78373953  0.73779176  1.0000000 0.565035003             NA     -0.13019546   -0.172274228
inf.inf          0.54912723  0.53900346  0.54742057  0.5650350 1.000000000             NA      0.02397828    0.000601271
sth.Constraint           NA          NA          NA         NA          NA              1              NA             NA
sth.Constraint2 -0.04749009 -0.07977041 -0.06508848 -0.1301955 0.023978279             NA      1.00000000    0.296038760
sth.fg.isolete  -0.02690834 -0.03687583 -0.03242513 -0.1722742 0.000601271             NA      0.29603876    1.000000000
cor(  ind.dat[,-1],use="pair")  #欠損があるので それについては使えるものは使って算出
                       in.d       out.d    in.out.d     btw.btw     inf.inf sth.Constraint sth.Constraint2 sth.fg.isolete
in.d             1.00000000  0.97312571  0.99237569  0.67506028 0.549127231    -0.05235129     -0.04749009   -0.026908345
out.d            0.97312571  1.00000000  0.99408757  0.78373953 0.539003459    -0.09012907     -0.07977041   -0.036875830
in.out.d         0.99237569  0.99408757  1.00000000  0.73779176 0.547420571    -0.07327064     -0.06508848   -0.032425127
btw.btw          0.67506028  0.78373953  0.73779176  1.00000000 0.565035003    -0.08548695     -0.13019546   -0.172274228
inf.inf          0.54912723  0.53900346  0.54742057  0.56503500 1.000000000     0.02927009      0.02397828    0.000601271
sth.Constraint  -0.05235129 -0.09012907 -0.07327064 -0.08548695 0.029270085     1.00000000      1.00000000             NA
sth.Constraint2 -0.04749009 -0.07977041 -0.06508848 -0.13019546 0.023978279     1.00000000      1.00000000    0.296038760
sth.fg.isolete  -0.02690834 -0.03687583 -0.03242513 -0.17227423 0.000601271             NA      0.29603876    1.000000000
#個人のダウンロード数など
load(file="0MGPdat.rda") 
names(MGPdat)
#ここでのmに含まれている人のみ
names(ind.dat)
MGPdat2<-merge( MGPdat,ind.dat,by.x="id2",by.y="rownames.m.")
MGPdat2
  • これに限定して回帰分析
summary(res<-lm(log(1+n_down)~btw.btw +inf.inf+sth.Constraint2+sth.fg.isolete,  MGPdat2))
  • 練習 この結果をどう解釈するか?
#参考)ステップワイズ回帰  説明力のあるものを順に投入していく
res.s<- step(res)
summary(res.s)
  • 練習 上の回帰分析の結果と何が違うか?

  • (以下余裕があれば)練習 ここでは mをはじめの50人に指定したが、適宜 Matから必要な部分(もしくは全体)を取り出して、同様の分析を行ってみる。