有很多朋友表示在社會(huì)網(wǎng)絡(luò)分析的第一步——生成鄰接矩陣遇到了一些困難。因?yàn)樯鐣?huì)網(wǎng)絡(luò)分析的算法幾乎都是基于矩陣的計(jì)算。所以把關(guān)系數(shù)據(jù)轉(zhuǎn)換為鄰接矩陣是一切分析的基礎(chǔ)。關(guān)于鄰接矩陣的定義,可以參看我的另一篇文章。閑話少說,進(jìn)入正題。
獲得關(guān)系數(shù)據(jù)的方式有很多,關(guān)系的內(nèi)涵也是各種各樣。比如文章的引用關(guān)系,醫(yī)院間病人的轉(zhuǎn)診,股東對(duì)不同公司的持股等等??梢哉f關(guān)系數(shù)據(jù)無處不在。本文以最常見的朋友關(guān)系為例來介紹一種生成鄰接矩陣的方式。文中會(huì)展示詳細(xì)的代碼,保證讀者看完之后都能實(shí)操。
朋友關(guān)系最常用的還是問卷法,采取提名的方式,如下圖:

如圖中所示,除了提名朋友的姓名之外,還可以設(shè)置一些題目對(duì)關(guān)系的屬性進(jìn)行評(píng)估。這些關(guān)系屬性的數(shù)據(jù)可以在未來做一些更豐富的分析,為了不偏離主題,本文暫時(shí)不做介紹。
被試完成問卷之后我們就需要把數(shù)據(jù)錄入。這里推薦一個(gè)比較好用的數(shù)據(jù)錄入工具 EpiData,也是可以對(duì)語法進(jìn)行編輯,可以設(shè)置數(shù)據(jù)格式(例如日期設(shè)置為yyyy/mm/dd)、取值范圍、跳轉(zhuǎn)條件等等,可以幫助我們規(guī)避很多錄入錯(cuò)誤。畢竟數(shù)據(jù)錄入是一個(gè)沒啥技術(shù)含量容易產(chǎn)生厭煩情緒的工作,而數(shù)據(jù)質(zhì)量是科研工作的基礎(chǔ)。語法寫好之后,程序會(huì)自動(dòng)識(shí)別輸入的合法性,大大降低出錯(cuò)的概率。完成之后可以直接導(dǎo)出為excel等文件,非常方便。
扯遠(yuǎn)了,回到主題。一般數(shù)據(jù)格式都是每一個(gè)被試為一行,稱為一個(gè)觀測(cè)(observation),每一道題目為一列,稱為變量(variable)。這里把英文給出來也是為了跟RStudio的界面對(duì)應(yīng)上,方便讀者前后聯(lián)系。完成數(shù)據(jù)錄入之后,圖1部分的社會(huì)網(wǎng)絡(luò)數(shù)據(jù)長(zhǎng)這個(gè)樣子:

這里你會(huì)發(fā)現(xiàn)做了一個(gè)降維的處理。圖1中原始的問卷是一個(gè)二維表格的形式,一個(gè)維度是朋友的名字,另一個(gè)維度是各種關(guān)系屬性。降維的話一般就是兩種,一種是按行降維,一種是按列降維。我們這里就是按行降維,D101-D108對(duì)應(yīng)圖1第一行的八個(gè)名字,D201-208對(duì)應(yīng)圖1第二行朋友的性別,以此類推。按行降維和按列降維都可以,方法也是一樣的,相信你看懂了按行降維的方法,按列降維自然就會(huì)了。因?yàn)檫@里的問卷設(shè)置,被試并不需要填滿8個(gè)名字。例如圖2中紅色方框所示,被試只填寫的前三個(gè)名字,那么相應(yīng)的,后面的題目也都是三個(gè)值。這個(gè)也可以用來判斷錄入是否有誤。
數(shù)據(jù)錄入完成之后就可以開始今天的正題了——生成鄰接矩陣
這里為了照顧到更多的讀者我會(huì)把基礎(chǔ)的操作也寫出來,大神請(qǐng)略過。
STEP 1:讀入數(shù)據(jù)
我們需要把數(shù)據(jù)讀入到R中去,如圖3所示:我的數(shù)據(jù)是csv格式的,所以就用read.csv()函數(shù)。成功讀入之后,在右上角的環(huán)境(environment)窗口中就會(huì)顯示你所命名的對(duì)象,并顯示其所包含的觀測(cè)數(shù)和變量數(shù)。由于我這里展示的數(shù)據(jù)是分多個(gè)文件保存的,所以每一個(gè)文件都需要讀取并命名。同樣格式的數(shù)據(jù)也可以合并,這個(gè)可以根據(jù)具體的分析需要來選擇,各有利弊。讀入文件的時(shí)候要注意以下三點(diǎn)。第一文件名要用引號(hào)引起來并且?guī)虾缶Y名。第二RStudio的工作路徑和數(shù)據(jù)文件的存儲(chǔ)路徑一致時(shí)引號(hào)內(nèi)只用寫文件名,查看工作路徑的函數(shù)為getwd(),此函數(shù)不用填寫任何參數(shù);或者在RStudio界面左下角控制臺(tái)窗口的頂端查看。第三如果第二點(diǎn)不滿足,有兩種處理方式,一種是將當(dāng)前工作路徑設(shè)置為數(shù)據(jù)文件的保存路徑,代碼為setwd("D:/社會(huì)網(wǎng)絡(luò)分析R語言實(shí)戰(zhàn)之生成鄰接矩陣"),引號(hào)內(nèi)為數(shù)據(jù)文件實(shí)際的存儲(chǔ)路徑,這里要注意的是RStudio使用的是右上至左下斜杠,windows使用的則是左上至右下斜杠,使用時(shí)注意區(qū)分;另一種處理方式是在文件名前面加上路徑。

STEP 2:安裝并加載所需程序包
我們需要安裝并加載所需要的包(package),如圖4所示。安裝是一勞永逸的,如果你之前安裝過,則無需再安裝了??梢酝ㄟ^右下角package窗口的搜索欄進(jìn)行搜索,所安裝的包都會(huì)羅列在package窗口,如果能搜索到,證明已經(jīng)安裝過了。但是加載包則不一樣,每次重新打開RStudio都需要重新加載。生成鄰接矩陣需要的包就只有dylyr一個(gè)。代碼及注釋圖中都有,我就不再贅述。

STEP 3:生成鄰接表
接下來我們需要把社會(huì)網(wǎng)絡(luò)部分按照關(guān)系發(fā)出者(sender)一列關(guān)系接收者(receiver)一列的格式(我把它叫做鄰接表)提取出來,如圖5所示。第一個(gè)方框內(nèi)的代碼是提取網(wǎng)絡(luò)部分的數(shù)據(jù),數(shù)字表示第幾列。被試,也就是關(guān)系發(fā)出者的姓名存在第4列;76-80對(duì)應(yīng)圖2中的D101-D105,84-88對(duì)應(yīng)圖2中的D201-D205,以此類推。這里并沒有提取全部的八個(gè)好友,而是只提取了班內(nèi)的好友。第二個(gè)方框內(nèi)的代碼是將五個(gè)對(duì)象(提名1-提名5)的列名統(tǒng)一,否則無法成功運(yùn)行下一個(gè)方框內(nèi)合并的代碼??紤]到不是每個(gè)人都把五個(gè)名字寫滿了,最后一個(gè)方框內(nèi)的代碼刪掉了那些沒提名的情況。

STEP 4:生成鄰接矩陣
有了鄰接表我們就可以將其轉(zhuǎn)換為鄰接矩陣了,如圖6所示。第56和57兩行代碼會(huì)在原來的對(duì)象“T1CLASS13”上增加一列新的變量,變量名為“Name_order”,內(nèi)容是對(duì)名字排序之后的數(shù)字。對(duì)象“T1CLASS13”中存放被試姓名的那一列列名為“姓名”。因?yàn)楹竺娴挠?jì)算不能用姓名直接計(jì)算,而需要給每一個(gè)人編一個(gè)號(hào)。比如現(xiàn)在有50個(gè)人,那么就從1排到50。第60行做了一個(gè)命名,目的是簡(jiǎn)化63和64兩行代碼里的參數(shù)。63和64兩行代碼在對(duì)象“提名_all”上新增了兩列變量,分別叫做“from_order”和“to_order”,變量?jī)?nèi)容為名字對(duì)應(yīng)的編號(hào)。第65行增加了一列名為“tie”的變量,內(nèi)容全為1。第66行則是把對(duì)象“提名_all”的第9到11列賦值給新的對(duì)象“提名_all.copy”。67行是刪掉缺失值的行。68行是做了一個(gè)數(shù)據(jù)格式的轉(zhuǎn)換,變成矩陣。69行則是創(chuàng)建了一個(gè)新的矩陣,名為adj,行數(shù)和列數(shù)都為班級(jí)人數(shù),元素則都為0。70行是把對(duì)象“提名_all.copy”中第3列的值按照其1、2列的坐標(biāo)賦值給對(duì)象“adj”。71行是將adj以txt文件輸出,文件名為T1CLASS13friend.txt。

最后,如果有寫的不清楚的地方,敬請(qǐng)留言批評(píng)指正。關(guān)于社會(huì)網(wǎng)絡(luò)分析有其他問題的也歡迎留言,共性問題我會(huì)在下一篇文章中詳細(xì)解答。
你的支持是我碼字的不竭動(dòng)力,謝謝!