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から必要な部分(もしくは全体)を取り出して、同様の分析を行ってみる。