天天看點

《資料科學R語言實踐:面向計算推理與問題求解的案例研究法》一一2.8 練習題

本節書摘來自華章計算機《資料科學r語言實踐:面向計算推理與問題求解的案例研究法》一書中的第2章,第2.8節,作者:[美] 德博拉·諾蘭(deborah nolan)  鄧肯·坦普·朗(duncan temple lang)  更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

q.1 使用read.fwf()寫一個函數将mentxt/和womentxt/中的28個文本表讀取到r中。這些文本表的名稱為1999.txt、2000.txt,等等,在2.2節中對它們有非常詳細的介紹。使用純文字編輯器檢查這些表格,以确定表中每一列(姓名,居住地,年齡,比賽時間和淨時間)的開始和結束位置。使用統計方法探索比賽結果并確定從文本的正确位置提取資訊。

q.2 修改extractvariables()函數(參見2.2節),去除mentables中的空白行。除此之外,消除以‘*’或者‘#’開頭的行。你會發現下面的正規表達式有助于定位到表中的空白行:

該模式使用了幾個元字元。“^”錨定字元串的開始位置,“$”錨定字元串的結尾,“[[:blank:]]”表示任意空格符或tab符的等價類,“”表示空格符可以出現0次或多次。整個表達式“^[[:blank:]]$”表示能夠比對從開頭到結尾含有任意個空格符的字元串。

q.3 查找時間僅為1.5的記錄,看發生了什麼?确定如何處理該問題以及哪個函數需要被修改,是extractrestable()、extractvariables()還是cleanup()。在你的修改中,應該包括一條提供警告消息的代碼,該警告提示哪些行是因為時間太短而被舍棄的。

q.4 檢查2006年男選手資料的頭部和尾部。觀察menresmat清單中的字元矩陣和menfiles清單中的字元向量(見2.2節)。(回想一下,我們期望的menresmat中的字元矩陣和menfiles中的字元向量都對應于名為"2006"的元素)。檢視居住地有什麼錯誤?仔細檢查頭部找出錯誤是怎麼發生的。修改extractvariables()函數來解決這個問題。

q.5 實作2.3節中所述的converttime()函數。這個函數輸入的字元串時間格式是hh:mm:ss或mm:ss,傳回值是與時間對應的數值型的分鐘數。設計該函數,以便輸入包含多個字元串的字元向量,并傳回一個數值型向量。

q.6 修改2.3節中的createdf()函數解決2006年男選手檔案的格式轉換問題。為了确定問題所在,你需要仔細地檢查原始的文本檔案。

q.7 按照第2.2節所述的方法讀取女選手檔案,然後使用2.3節中的函數處理這些資料,建立資料框以便進行資料分析。你可能需要泛化createdf()和extractvariables()函數,以處理原文本檔案中額外的異常情況。

q.8 修改建立圖2-6的plot()函數調用以建立圖2-7。為此,你需要閱讀plot()函數的文檔以确定哪個參數是有用的,也就是,?plot.default包含的有關常用繪圖參數的有用資訊。

q.9 修改2.4.2節中的分段線性拟合,在70歲處添加一個拐點。檢查拟合系數并比較拟合曲線和loess曲線。額外的拐點可以提高拟合度嗎?分段的線性模型更接近loess曲線嗎?

q.10 我們看到1999年的參賽選手普遍比2012年的選手年長。使用分位數-分位數圖、箱線圖和密度曲線,來比較全部14年來參賽者的年齡分布。年齡分布是如何随着年份改變的?它是漸進變化的嗎?

q.11 使用同齡人的最快跑步時間來标準化每位男選手的跑步時間。為此,需要找到20~80歲每個年齡中跑步最快的選手,這裡使用tapply()函數可能有幫助。使用loess()函數平滑時間,并用predict()函數找出平滑後的時間值。使用這些平滑後的最快時間去标準化每一個跑步時間。用密度曲線、分位數-分位數圖和概要統計資料對1999年和2012年參賽者的“年齡-标準化時間”分布進行比較。你會發現什麼?對女選手重複以上過程。将女選手在1999年和2012年的分布以及男選手在1999年和2012年的分布進行比較。

q.12 清洗menres裡home中的字元串,移除全部的首尾空白符和多個連續的空格。同時将所有的字母變為小寫,從字元串中移除所有的标點符号,如“.”、“,”或“’”。将清洗後的home版本存放到menres中,并命名為homeclean。

q.13 在2.5節中我們通過将名字、出生年月、州名組合在一起為每位參賽選手建立了一個id。考慮使用居住地代替州名,這樣對比對會有什麼影響?有多少參賽者使用這個新的id參加了至少8場比賽?如果你将比賽次數減少為6場呢?在比對過程中應該使用該額外限制嗎?

q.14 在縱向分析中,通過舍棄那些在連續比賽場次中時間間隔較大和沒有完成兩次或兩次以上比賽的選手id,來進一步提煉運動員集合(見2.5節)。當你添加這些額外限制後還有多少唯一的id?2.6節中的縱向分析結果發生變化了嗎?

q.15 按照2.5節中編寫的程式,清洗女選手的姓名和居住地,并為女選手建立縱向記錄。然後按照2.6節中的模組化方法,研究參加了多場比賽的女選手的年齡和比賽用時之間的關系。

q.16 考慮在縱向分析中采用非參數曲線拟合方法。rice[4]建議将平均曲線和個體曲線組合起來,對個體行為模組化。也就是說,個體水準的預測是平均曲線和個體曲線之和:yi(t)=(t) + fi(t) + ∈,其中yi(t)是個體i在年齡t時的水準。他建議采用“兩步”處理過程來進行:(a)對所有個體的平滑曲線取一個魯棒性強的平均值;(b)在個體資料點中減去平均平滑曲線值,并平滑殘差。

rice同時還建議在生成個體曲線的過程中,要在最近鄰的時間集上進行平滑,而不是隻用個體的跑步時間去生成個體的曲線。此處的最近鄰指的是年齡和跑步時間都比較接近的一個選手。

q.17 在2.7節中,我們發現2000個男選手結果的html檔案格式非常差以緻無法利用htmlparse()函數修複檔案以從

繼續閱讀