Luo Fei Site

Welcome to My blog:

  • I am a public health reasearcher worked in Chongqing China.
  • I am learing using R language for statistical analysis in infectious diseses.
  • I will record the issues encountered during the learning process as well as my solutions. You are welcome to leave your valuable comments
  • Many thanks for your visting !

scanstatistics包在公共卫生中的应用

1 什么是时空扫描统计? 扫描统计学主要用于观测多个位置上时间序列数据或事件数据,检测数据集中的异常聚集, 在scanstatistics包(Benjamin Allévius 2023)主要能实现以下功能: 首先将研究区域划分为多个位置(位置点或网格),观测每个位置上一段时间内的数据变化或事件发生情况。 然后从现在向过去延伸,在空间上选取若干位置,在时间上选取一定时间段,形成空间-时间聚集。每个聚集对应选定的位置集合和时间间隔。 对每个空间-时间聚集计算一个统计量,反映该聚集内观测到的数据或事件与预期值的差异。 报告统计量最大的几个空间-时间聚集,它们可能对应数据或事件的异常聚集。 重复这个过程,对不同的空间-时间聚集进行检验,找到研究区域内所有潜在的异常聚集。 # 使用扫描空间统计的常见步骤有: 数据资料准备。 如事件数据、时间序列数据等。数据要包含空间位置信息和测量值或事件计数信息。 设置研究区域和空间格网。根据数据空间范围设置研究区域,并在区域内划分网格。网格形状和大小根据具体研究目标确定,通常情况使用行政区划的地图。 选取空间聚集的时间窗口。从当前时间向过去延伸,选择一个或几个时间窗口,如最近1周、2周等。 在研究区域内,选择若干空间窗口和时间窗口组合,形成空间-时间聚集。每个聚集对应一组位置(空间窗口)和一段时间区间(时间窗口)。 计算每个空间-时间聚集的观测值与预期值的差异,得到聚集的统计量。统计量可直接使用观测值与预期值的差异,或基于该差异计算s标准华的差异比值等。 识别统计量最大的k个空间-时间聚集,作为潜在的异常聚集中心。k的选择根据研究目标确定,通常为3到5个。 对k个异常聚集中心,进行进一步分析,如数据动态监测、空间相关探索等,判断聚集的显著性和可能原因。 重复步骤4到步骤7,调整空间-时间聚集的设置,完成对整个研究区域的扫描检验,找到所有潜在异常聚集。 根据扫描检验结果和进一步分析,得出研究结论,识别空间聚集模式以及影响因素。 # 示例:重庆市输入性疟疾时空聚集分析 # scanstatistics包中的主要函数 ## 扫描统计函数 scan_eb_poisson:最常用的函数, 基于Poisson分布模型期望值的扫描统计检测聚集时间(M. Kulldorff et al. 1998)。 scan_pb_poisson: 基于总体值(M. Kulldorff 2010). scan_eb_negbin: 基于负二项分布模型。 scan_eb_zip: 基于零膨胀Poission分布模型期望值。(B. Allévius and Hhle 2017) scan_permutation:基于时间-空间置换模型。(Martin Kulldorff et al....

May 22, 2023 · Luo Fei

tidyverse系列-purr

library(tidyverse) rm(list = ls()) 本系列主要是又来挖坑想对tidyverse(Wickham 2023)这个整合包的各个包的使用说明做一个完整的中文介绍。本章主要介绍purrr包(Wickham and Henry 2023), purrr包通常被称为“优雅的循环迭代包”,它比for循环的速度快,代码更容读。 # map()函数 0.1 一个列表 map(.x, .f, ...)map系列函数会将一个函数应用到输入的列表或向量的每个元素上面,然后返回一个list。比如: x <- list(1:10, 11:20, 21:30) l1 <- list(x = c("a", "b"), y = c("c", "d")) map(l1, sort, decreasing = T ) # $x # [1] "b" "a" # # $y # [1] "d" "c" map_dbl(.x, .f, ...)返回双精度向量 # map_dbl(x, ~ mean(.x, na.rm = T)) map_dbl(x, mean) # [1] 5.5 15.5 25....

November 4, 2022 · Luo Fei

R数据分析与统计推断基础2-数据可视化

这些教程主要市基于“modrndive”包(Kim and Ismay 2022)的参考手册和自己浅薄的R使用经验编写,主要目的还是引导重庆的公共卫生人使用R语言分析数据,撰写报告,减轻重复劳动的负担。 图0.1: Family of tidy packages. 1 需要使用到的包: library(tidyverse) # tidy系列数据分析套装 library(moderndive) # 统计推断、数据模拟,统计学导学 library(nycflights13) # 航班数据库 library(gapminder) # gap minder 数据库 library(gtsummary) # 超棒的统计表格自动生成 library(skimr) # 描述性统计包 library(infer) # 统计推断 在R里面对于数据可视化当然要用到数据可视化的王者ggplot2(Wickham et al. 2022)。 Gapminder 数据 TED talk “The best stats you’ve ever seen”。其中的数据来源就是,随机抽取其中5行数据看看1.1。 表1.1: Gapminder数据 country continent year lifeExp pop gdpPercap Gambia Africa 1997 55.9 1235767 654 Netherlands Europe 1997 78....

October 29, 2022 · Luo Fei

sruvial生存分析包参考资料(一)

library(tidyverse) library(survival) library(survminer) library(gtsummary) theme_gtsummary_journal("lancet") theme_gtsummary_language("zh-cn") 关于survial包做生存分析的记录 基础知识 生存分析 生存分析(survival analysis)是生物医学研究中常用的分析方法。在队列随访研究中,我们会事先定义一些观察终点,比如肿瘤复发、患者死亡、血压达标等,这些终点称为事件(event)。从研究开始到发生事件的时间间隔称为生存时间(survival time),某些场景下也称为失效时间(failure time)。由于生存时间数据具有以下两个特点,所以提出生存分析这一特殊的分析方法: (1)偏态分布:生存时间通常具有明显的偏态分布,有正态分布假设的统计方法不能适用。 (2)删失(censoring):研究对象在观察时间内没有发生事件称为删失。一种情况是研究对象在中途失访或退出,导致没有观察到事件;另一种情况是超过了最长的随访时间事件仍未发生。删失数据是一种不完整数据,是生成分析独有的重要组成部分。 包里的常用函数 Surv() 函数主要用于对时间和状态变量进行转换,主要作为模型的自变量,放在模型方程左边,例如: Surv(time, status ) 右截断数据(right censored data)在进行随访观察中,研究对象观察的起始时间已知,但终点事件发生的时间未知,无法获取具体的生存时间,只知道生存时间大于观察时间,这种类型的生存时间称为右删失。 Surv(time, endpoint=='death') 状态变量是因子或字符的时候 Surv(t1, t2, status) 连续的过程变量 Surv(t1, ind, type='left') 左删失 左删失(Left censored)假设研究对象在某一时刻开始进入研究接受观察,但是在该时间点之前,研究所感兴趣的时间点已经发生,但无法明确具体时间,这种类型即为左删失数据。例如,某项关于脑卒中复发危险因素的研究,生存时间规定为从第一次脑卒中发病到下一次脑卒中发病之间的时间间隔。在研究起始时刻对研究对象进行问卷调查,询问是否发生过脑卒中,以及第一次脑卒中发病的时间,如果研究对象回答“发生过脑卒中。 aareg() Aalen’s additive regression model. coxph() Cox比例风险模型 coxph(Surv(time, status) ~ x, data=aml) -标准cox模型 coxph(Surv(t1, t2, stat) ~ (age + surgery) * transplant) -时间相关协变量...

October 27, 2022 · Luo Fei

全国各省新冠疫情分析

0.1 新增感染者情况 8月17日0-24时,全国(除港澳台外)25个省市报告新增本土感染者3424例(较前日增加504例),新增数排前5位的依次是海南、西藏、新疆、陕西、青海,分别为2018例、889例、233例、65例、60例。详见图1。 Figure 1: 全国新冠肺炎新增感染者情况 0.2 累计报告感染者情况 自2022年7月1日起,全国累计报告感染者人数较多的省份(剔出无症状转确诊)为海南13814例,甘肃4516例,广西3739例,西藏3469例,新疆3193例,安徽2326例,河南1096例等省市,见图2。 Figure 2: 7月1日至今全国累计报告感染者分布图 0.3 近10内各省报告感染者数量变化趋势 对近10日内各省报告数据分析显示,感染者数量呈上升趋势的省份(增速)分别为西藏(0)、海南(0)、陕西(0)、云南(0)。 报告数量呈下降趋势的省份(降速)分别为() ,见图3。 Figure 3: 近10日全国各省感染者报告情况 Table 1: 近10日各省报告感染者数线性回归分析结果 省份 变化趋势 标准误 p值 显著性 西藏 0.001 0 0.000 <0.05 海南 0.001 0 0.020 <0.05 青海 0.000 0 0.070 / 陕西 0.000 0 0.046 <0.05 兵团 0.000 0 0.084 / 江西 0....

August 18, 2022 · Luo Fei

ggplot2笔记

使用到的R包: 1 gghigglight包的使用

April 8, 2022 · Luo Fei

R社交网络分析包在传染病传播链可视化的应用

初衷 在这次疫情处理过程中,了解到在梳理传播链的过程中,很多时候仍然是手工在powerpoint等软件绘制传播链的。采用这种方式的优点能够在图中根据设计者需要加入较多的信息,比如:人员大致位置分布,接触的途径和强度等信息。不足之处在于,在链条上节点(感染者)较少的时候还能够梳理得很明确,但一旦节点达到一定数量,其中关系复杂度将呈几何倍数增加(比如1人传多个,1人与多个感染者有接触之类)。 在这种情况下。单纯的手工整理,将耗费非常多的脑力。最严重的缺点是,当现场流调信息变更,对链条进行修订的时,其中一个节点或链接的变化,会因连锁作用导致整个链条的变化。节点越多,变化的影响范围越大,越复杂,就像整理线头一样。当感染者人数上升到一定数量时,手动整理已经变成了一件难以完成的事情。由于本人对R的热衷,探索了一下能不能使用软件自动化链就是自己懒嘛的方式绘制传播,使用igraph,ggraph和networkD3最终效果如下面几张图,个人觉得还是networkD3炫酷的互动效果最好。 具体制作过程 参见我使用的3个包的说明。。。。。详细步骤待补充。 数据 节点数据 节点数据里面只需要包含所有感染者的基本信息,比如编号,姓名,类别等等。 边数据 边数据最基础的要求为,节点数据左右感染者的对应关系,简单说就像Excel两列,第一列from, 第二列to,代表每一行两个感染者的关系,从谁传播到谁,当然这些资料需要辛苦在现场的流调专家们提供。 可视化 igraph 首先使用graph_from_data_frame(d =line, vertices = node, directed = T)将节点和边转换成igraph,就可以直接plot第一张图, 参数自己可以调节。 netwokd3 个人最喜欢的效果,使用igraph_to_networkD3命令,将igraph数据转换一下,就可以使用simpleNetwork,forceNetwork,sankeyNetwork(画出交互性网络图了。试验了下,手机浏览器一样可以互动,包括拖动节点,放大,移动等,非常棒的体验。 {"x":{"links":{"source":[2,8,10,12,3,7,56,2,14,13,1,56,0,2,2,2,2,3,4,5,6,7,7,1,56,1,9,2,11,6,24,3,56,7,12,12,1,12,12,6,7,10,15,15,7,28,30,12,7,56,16,14,14,17,37,18,53,2,56,1,5,3,6],"target":[10,11,12,12,13,14,15,16,17,18,19,19,1,20,21,22,23,24,25,26,27,28,29,2,2,30,31,32,33,34,35,35,36,37,38,39,3,40,41,42,43,44,45,46,47,47,47,48,49,4,50,51,52,53,53,54,55,5,6,7,8,9,9],"value":[8,4,8,3,8,8,4,8,8,4,8,3,3,8,8,8,8,8,8,8,8,8,8,8,3,4,8,8,8,8,3,8,4,8,6,8,3,8,8,8,8,8,8,8,8,3,3,8,8,4,8,8,8,8,3,8,4,8,4,4,8,4,2],"colour":["#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666","#666"]},"nodes":{"name":["0号","1号","2号","3号","4号","5号","6号","7号","8号","9号","10号","11号","12号","13号","14号","15号","16号","17号","18号","19号","20号","21号","22号","23号","24号","25号","26号","27号","28号","29号","30号","31号","32号","33号","34号","35号","36号","37号","38号","39号","40号","41号","42号","43号","44号","45号","46号","47号","48号","49号","50号","51号","52号","53号","54号","55号","56号"],"group":[2,2,2,1,7,2,1,6,5,1,2,5,8,4,3,9,2,3,4,2,2,2,2,2,1,7,2,1,6,6,6,1,2,5,1,1,2,3,8,8,8,8,1,6,2,9,9,6,8,6,2,3,3,3,4,3,2],"nodesize":[200,150,30.6,34,35.6,43.1,40.5,10.8,46.9,44.5,42.8,46.8,22.8,27.3,25.4,18.7,11,14.2,23.1,12.4,31.3,11.1,21.7,11.6,11.2,1.3,24,48.2,33.1,2.9,29.2,15.5,45.1,38,23.8,44.4,32.7,15,36,41.2,4.8,22.9,1.6,38.9,41.1,38.6,43.3,9.9,2.1,46.1,12,42.3,1.8,18.9,40.6,27.9,20]},"options":{"NodeID":"name","Group":"group","colourScale":"d3.scaleOrdinal(d3.schemeCategory20);","fontSize":12,"fontFamily":"serif","clickTextSize":30,"linkDistance":50,"linkWidth":"function(d) { return Math.sqrt(d.value); }","charge":-30,"opacity":2,"zoom":true,"legend":false,"arrows":true,"nodesize":true,"radiusCalculation":" Math.sqrt(d.nodesize)+6","bounded":false,"opacityNoHover":1,"clickAction":null}},"evals":[],"jsHooks":[]} {"x":{"links":{"source":[2,8,10,12,3,7,56,2,14,13,1,56,0,2,2,2,2,3,4,5,6,7,7,1,56,1,9,2,11,6,24,3,56,7,12,12,1,12,12,6,7,10,15,15,7,28,30,12,7,56,16,14,14,17,37,18,53,2,56,1,5,3,6],"target":[10,11,12,12,13,14,15,16,17,18,19,19,1,20,21,22,23,24,25,26,27,28,29,2,2,30,31,32,33,34,35,35,36,37,38,39,3,40,41,42,43,44,45,46,47,47,47,48,49,4,50,51,52,53,53,54,55,5,6,7,8,9,9],"value":[8,4,8,3,8,8,4,8,8,4,8,3,3,8,8,8,8,8,8,8,8,8,8,8,3,4,8,8,8,8,3,8,4,8,6,8,3,8,8,8,8,8,8,8,8,3,3,8,8,4,8,8,8,8,3,8,4,8,4,4,8,4,2]},"nodes":{"name":["0号","1号","2号","3号","4号","5号","6号","7号","8号","9号","10号","11号","12号","13号","14号","15号","16号","17号","18号","19号","20号","21号","22号","23号","24号","25号","26号","27号","28号","29号","30号","31号","32号","33号","34号","35号","36号","37号","38号","39号","40号","41号","42号","43号","44号","45号","46号","47号","48号","49号","50号","51号","52号","53号","54号","55号","56号"],"group":["0号","1号","2号","3号","4号","5号","6号","7号","8号","9号","10号","11号","12号","13号","14号","15号","16号","17号","18号","19号","20号","21号","22号","23号","24号","25号","26号","27号","28号","29号","30号","31号","32号","33号","34号","35号","36号","37号","38号","39号","40号","41号","42号","43号","44号","45号","46号","47号","48号","49号","50号","51号","52号","53号","54号","55号","56号"]},"options":{"NodeID":"name","NodeGroup":"name","LinkGroup":null,"colourScale":"d3.scaleOrdinal(d3.schemeCategory20);","fontSize":16,"fontFamily":null,"nodeWidth":15,"nodePadding":10,"units":"Letter(s)","margin":{"top":null,"right":null,"bottom":null,"left":null},"iterations":20,"sinksRight":true}},"evals":[],"jsHooks":[]} ggraph ggraph基本研用了ggplot2绘图的方式,画出来的图也相对更漂亮。首先使用tidygraph包将igraph类型的数据转换为ggraph更合适的元数据。然后可以愉快地使用ggplot2的方式画图了。

March 25, 2022 · Luo Fei

上海疫情数据简单可视化分析(4月20日更新)

今天本地的疫情终于没有增加,抽了点时间关注其他地区的疫情形势。看官方通报的数据,对曾经的模范城市的疫情有兴趣,决定来简单看看。 1 数据获取 1.1 数据来源 要获取准确的数据,当然是上官方网站。打开上海市卫健委的官网(https://wsjkw.sh.gov.cn/xwfb/index.html),疫情数据公告都在“新闻发布”栏目中疫情信息的标题中就包含了所有新增、确诊数据。真是太方便了。 library(rvest) library(tidyverse) library(lubridate) library(readxl) library(openxlsx) library(ggforce) library(mgcv) library(deSolve) library(FME) 1.2 数据 上海的疫情变化主要从3月开始 1.3 数据清洗 这一步比较麻烦的是对标题中日期字符的整理。使用str_extract_all命令后提取的日期,变成了列表。再合并为向量形势的日期格式数据时出了点麻烦。最后使用了笨办法for循环unlist后再paste0合并。其实直接用标题前的日期-1没什么大的误差,主要是在跟自己较劲搞得这么麻烦。 2 好了,开始分析吧 2.1 先画个简单的图看看大趋势 以报告感染者类型为颜色看,从20年1月到21年12月期间,上海的感染人数几乎在处于一个长期稳定的状态,从2022年3月开始呈直升飞机式的增长。奇怪的是中间咋有个空白区,没有数据。查看原始网页,发现网站从2021年11月6日-2022年1月1日没有更新数据。这是一个奇怪的现象。不过没关系,这不影响我们后面的分析,这对原因分析有很大关系。 2.2 输入感染者的趋势 对上海这波疫情有个合理的猜测是,1月初上海接纳大量某地的航班的,导致上海市输入疫情压力陡增,再加上Omicron变异株超强传播能力,双重压力下导致这个模范城市失守。好吧,我们来看看是否能验证输入压力陡增这个猜测。从图上看新增输入的感染者数量变化并不大,鉴于确诊和无症状都属与感染这,下一步我们把本地和输入的感染者的合计数的变化可视化看看。 2.3 感染者总数 先用二者做个散点图看看,如图,完全看不出啥关系啊。。。。输入感染者较多的时候,反而本地感染处于低水平。这个图像,线性回归暂时也不考虑。我们还是从感染者数量和时间的关系看看。 画出来如下,大致能看出在3月14日前,上海几乎没有本土感染病例。 2.4 2022年3-4月 我们把时间尺度拉大到2月中旬到3月看看。放大后(下图1)到3月14日,输入感染人数开始上升,此时上海本地感染数量仍然无幅度的改变,处于平稳状态。为了更仔细看清楚变化情况,我们将y轴的数量调整至0-1000例,这时候能清楚看到每天的变化,本地感染者(蓝色)数量从3月16日快速上升者。 2.5 重点关注3月的数据 2.6 地区分布 获取了地区分布的疫情数据,结果很明显,浦东新区感染者数量最多,见下表: Local 2022-04-07 2022-04-06 2022-04-05 2022-04-04 2022-03-28 2022-03-31 2022-03-30 2022-03-29 2022-03-27 2022-04-01 2022-03-24 2022-03-26 2022-04-03 2022-03-23 2022-03-20 2022-03-21 2022-03-19 2022-03-22 2022-03-25 浦东新区 9050 8457 8145 7071 2506 2407 2207 2183 1429 NA 193 323 NA 436 220 169 135 NA NA 闵行区 2257 2409 2937 1381 NA 392 780 987 619 1043 980 972 NA 256 NA 122 NA NA NA 徐汇区 2076 1107 920 1229 NA 226 404 1100 277 639 167 331 NA 212 46 130 122 NA NA 黄浦区 1380 1044 658 970 NA 121 361 110 56 260 204 320 824 40 42 98 72 118 NA 松江区 1288 781 796 1106 NA NA 476 426 190 948 184 158 NA 68 18 76 32 NA NA 普陀区 957 1033 483 254 NA 15 146 113 70 245 38 69 NA 68 36 31 50 NA NA 嘉定区 933 NA 481 237 NA 54 158 255 0 0 130 0 NA 69 0 NA 81 NA NA 长宁区 852 350 84 33 115 256 128 30 90 74 118 29 NA 22 13 52 24 38 8 虹口区 594 668 410 608 NA 128 84 73 27 61 58 50 NA 52 24 46 NA NA NA 宝山区 414 660 554 265 311 17 504 363 94 45 87 153 NA 138 26 134 NA 32 8 杨浦区 601 630 623 220 NA 174 100 99 70 134 21 23 NA 22 16 20 28 NA NA 奉贤区 92 556 144 64 230 183 130 96 90 161 48 168 119 12 26 22 12 NA NA 静安区 381 545 302 50 104 164 102 175 70 189 70 108 338 96 64 88 30 NA 4 崇明区 520 126 79 94 NA 44 386 55 472 166 164 54 NA 108 NA NA NA 38 82 青浦区 493 470 384 314 NA 95 77 174 86 174 26 44 NA 20 8 10 10 40 26 金山区 129 79 77 52 NA 42 66 26 0 49 0 0 NA 0 22 NA NA NA NA 画个玫瑰图看看,其实这个图并并能很好反应数据特征。...

March 24, 2022 · Luo Fei

基于Rmrakdwon的可重复文档  [draft]

对于一个公卫狗来说,很多工作都在分析数据、撰写报告总结的内容。这些文档有周报、月报、季报、年报。在使用R之前,经常会对同样架构的不同时间的的数据进行重复的分析和撰写。Rmarkdwon提供了非常便利的可重复复文档,简单来说就是根据跟新的数据库一键生成同样格式的文档。文档的类型可以是PDF和WORD。非常的便利。 1 Rmarkdown基础 1.1 markdown Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版。它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出HTML、PDF以及本身的.md格式的文件。因简洁、高效、易读、易写,Markdown被大量使用,如Github、Wikipedia、简书等。 Markdown已经是一种轻量化的语言,他的不足在于当需要转换为PDF或者WORD格式时有点力不从心了。针对这问题,目前供职与Rstudio的谢益辉大神在Markdown的基础上开发了rmarkdwon包。Rmarkdown的优点有: 具备markdown简单的文本标记语言; 相较于markdown有更丰富的文档排版能力; 可以在生成文档时直接运行插入的代码块,并将运行结果输出在最终文档中。 1.2 基本语法 Rmarkdown的基本语法与markdwon相同,几乎所有markdown能用的语法都可以在其中使用。 常用的markdown语法见表1.1,更详细的语法请参考Markdown官方教程 表1.1: Rmarkdown的优点 输入 结果 普通文本 普通文本 *斜体文本* 斜体文本 **加粗文本** 加粗文本 ***斜体加粗文本*** 斜体加粗文本 ~~删除线文本~~ 删除线文本 上标^文本^ 上标文本 `代码文本` 代码文本 # 一级标题 1.3 建立Rmarkdwon文件 在RStudio选择文件-新建-Rmarkdown就可以建立一个最简单的rmarkdown的模板。(图 1.1) 图1.1: 新建rmarkdown文件 新建文件后会弹出新的窗口,如图1.2所示。窗口中可以设置标题、作者和输出文件类型。在左边栏选择”From Template”会有更多的模板更选择。你也可以安装相应的R包扩展更多的模板。 图1....

March 3, 2022 · Luo Fei

20年前的坑  [draft]

这是自己20年前因暗黑破坏神和英雄无敌3游戏有感而创作的。。放这里存档! 1 启程 透过破烂的窗户,骑士萨德列看到的是象被泼上了黯淡的黑血的天空,墨一样的血慢慢的从天的尽头一直延伸到头顶。那样的死寂,如此的凄凉! 也不知是从什么时候开始世界变成了现在这个样子,萨德列只记得从有记忆开始就是这样,10年过去了,还是这样。想起父亲临终前对自己说的话“萨德列,我的儿子,记着我的话吧。到远方去,遥远的地方,在那里你的使命在召唤你。你是我的儿子,骑士之子,你的命运就此已经注定。”从此,萨德列就开始了流浪,从12岁开始自己就背着父亲的剑和盔甲开始了毫无目的的流浪,仿佛是没有尽头的流浪。10年的流浪…… 可他还是不知道父亲说的远方到底是哪里。他只知道从一个地方飘荡到另一个地方。 “远方,使命!” 一阵敲门声打断了萨德列的回忆。 “进来!” 旅馆的侍女打开门,端上一盘丰盛的晚餐。“先生,你的晚餐!”说完把盘子放在桌上,然后退了出去。萨德列坐下来,开始慢慢享用他的食物。一段辛苦的旅行中最美丽的事情,莫过与在旅馆舒服的洗个澡,再来一份精美的晚餐!最好还能有美酒!可是在这种小旅馆,也只能用这些下三滥厨师弄的东西来将就了。 夜深了,窗外的风呼呼的叫着,仿佛是垂死的精灵的呼吸。萨德列躺在床上,望着天花板,心里又开始了对父亲的思念。父亲总是那样富有智慧,高大的身影总是在心头一次又一次的浮现。他慈祥的脸上露出的笑容可以让自己忘掉所以的不幸与悲伤!萨德列起身拿出父亲的剑。锋利的剑身,被磨得光滑的剑柄。萨德列轻轻的抚摩着。“父亲的味道在散发,是你啊。父亲……” ……. 高大的树木,数不清的树木。漫天的雪花,鹅毛般的飘落。堆积在树上,林间的空地上!雪地上,一串脚印一直延伸到林子的深出。在脚印的尽头是一个靠在一棵参天大树下的人。凛冽的寒风像刀子般的刮着。革拉特已经逃亡了一星期了。整个星期都在这见鬼的森林里,怎么都走不出去,但这样也好。只有大雪才能让那些追踪的家伙也找不到他。革拉特坐在树下,望着漫天的飞雪。炯烁的眼睛凝视着雪花被风吹着打转,他伸出手接住雪花,看它们慢慢的在手中融化。他的嘴角露出一丝笑容,他站起身来,肩上的雪花簌簌的落下来,抬起头望了望天空,笑了笑,又往林子深处前进。他高大的身影慢慢的消失在树木的影子里。 第二天早晨,萨德列起床后在旅馆匆匆吃了点早餐就出去了。这个叫密拉达的小镇属于艾拉西亚王国,是一个龙蛇混杂的地方,各式各样的人都有。也有的不是人,精灵呀,矮人呀,吸血鬼……这片大陆的主要种族这里都有。萨德列来到一家酒馆,酒馆是个好地方,无论你想打听什么消息,或者你想了解一下这个地方的情况,做好的办法就是到这里的酒馆里去看看。这个酒馆的老板是个精灵,罕见的一个年老的精灵。绿色的长发随意地搭到在肩上,最引人注目的还是他那尖尖的耳朵了,让一看就知道是精灵。一身打扮象极了市侩的商贩。萨德列很奇怪,怎么精灵也学着做生意了。萨德列来到柜台前,要了杯葡萄酒,然后自行找了张凳子坐下来。他一边缓慢地品味着杯中的葡萄酒,一边装着随意地观察周围的食客。酒馆不大,大概有20几个人在里面。其中有个红胡子的矮人引起了萨德列的注意,还有就是一个一直呆在角落里一个人喝酒的人。看他的打扮象是一个法师或者炼金士。 突然,一群人恶恨恨地从门口冲进来,最前面的是一个身材高大的家伙,满脸的胡子乱刺刺的毡着,好象是被烧焦了。一群人用目光在酒馆的食客中搜索。最后停在了一个法师打扮的人身上。看上去像带头人的家伙,脸上露出憎恨的表情。他挥了挥手,手下都慢慢的拔出了刀,开始向法师打扮的人走近.酒馆里一些胆小的,怕惹事的都开始从门口跑了出去.那法师打扮的人却依然慢慢的吃着自己的食物,好象根本就不知道那群人的存在。待几个恶棍走到足够近的时候,挥舞着手中各式各样的武器向他扑去。萨德列坐在那里静静的看着这一切的发生.只见那法师打扮的人,手一扬一团火球打在冲在最前面的一个。把他打得直向后飞,撞在后面跟上来的几个身上.魔法的火焰在身上燃烧.几个撞到一起的人身上都着了火,在地上滚来滚去的大叫。但这并没有阻止后面的几个继续向前冲.法师又连续打出几个火球,又是几个人倒下去。可已经有几个到了他跟前。几把明晃晃的刀向他砍去。萨德列已经把自己的剑拿了出来,随时准备出鞘。只见那法师把酒杯里的酒泼出来,酒瞬间在他面前化成了一层冰护盾,几把刀全砍在护盾上。刀的主人也被反弹力震得后退,有一个的刀都脱了手。法师乘机又打出几个火球,又是几个人倒下。萨德列也挺惊讶的,看来这法师还不能小觑,居然还会这种等级的护盾魔法。进来的一群人已经剩下大概不到10个了。萨德列心想不用自己出手,他自己也可以应付了。突然,一只箭插在法师胸口.萨德列心里一惊,朝箭射来的方向望去,只见那个满脸胡子的大汉,手里拿着一把弓箭,冷笑着。大汉继续搭箭,萨德列却飞快拔出剑,象老鹰一般朝大汉冲去。全场人只见一道寒光闪过,大汉呆在那里。萨德列的剑已经在鞘里了。全场的人都楞住了!大汉的弓从中间断开,他眼中充满了恐惧与惊讶。全场的人都清晰的看见一道血痕从大汉眉心裂开.鲜血一下子喷了出来,然后慢慢的倒下。其他恶棍看着眼前的一切,还每反应过来,都还呆站着。萨德列飞快的向法师方向冲过去,随着几道剑光,又是几个恶棍倒下了。剩下的几个丢掉自己手中武器飞一样的跑了。 萨德列快步向法师走过去。法师手捂住胸口,脸上毫无血色。萨德列正要拿绷带给他止血时发现他已经开始使用治疗魔法了。过了大概一分种的样子。法师的脸已经渐渐恢复血色,显得红润了。萨德列刚想和他说话,那法师却开了个传送门走了。只留下他自己一个人站在乱七八糟的旅馆里。他苦笑了一下,自己费半天劲救了人却给自己找了个麻烦,结果自己却连一句感谢的话都没听到。他回到房间拿起自己的行李准备走了。他知道过不了多久就会有一大群人来找他的麻烦了。 萨德列走出小镇没多久,却发现自己又不知道该往哪儿走了。他来到一个叉路口,捡起一小截树枝,然后蹲下来把树枝立起来,树枝倒下了。他就朝着树枝倒下的方向前进。他心里知道,路就跟他的未来一样,自己不知道路的尽头是什么地方,就象不知道前方等待他的又是什么命运。但路是要走的,人也是要活下去的。 2 狼与人 革拉特从树林里出来时已经几乎成了一个雪人。他整理了一下衣服,上面的雪簌簌的掉了下来。他用锐利的眼神观察了一下四周,发现没什么异样的。心里才松了口气,总算把那些家伙摆脱了。 走出森林是一片旷野,放眼望去只能看见一些稀疏的小树林。这可不是一个逃亡的好地方,得赶快走出这里。革拉特知道过了这里就是一座高山了,在那里就好隐蔽了。他打起精神,继续向前走去。 革拉特正走在路上,突然一股危险的信号在脑海闪过,他急忙闪到一快稍微大点的岩石后面。他从岩石后面探出头看了看。远方一群恶狼,正向他的方向靠拢。“该死的,这种时候怎么遇到这群畜生。” 由于在森林的游荡了一个多星期,革拉特已经没多少体力了。 “怎么办怎么办?”革拉特脑子里闪过无数个念头,都被自己一一否决了。野外的狼群是最难对付的。它们大多都是饿了几天的,现在好不容易找到一个猎物怎么会轻易放弃。说不定它们已经跟踪他好久了,直到现在才开始动手的。 革拉特躲在岩石后面,发现自己居然能听到自己的心跳声。自己经历了无数次危险从来没有象现在这样感到无助,绝望。 “难道今天我就会死在这里?死在这些畜生嘴上?老天怎么会这样对我?我还有很多事情要做!” 一股风吹过来,风中带着野兽特有的味道,也是死亡的气味。革拉特已经能听到狼的呼吸声和细小的脚步声。他闭上眼睛,准备等待死亡的来临。当他闭上眼睛后,脑子一下子清醒很多了。耳朵听到的不光是狼的呼吸,还有风的声音,有雪花落下的声音,有自己还在跳动的心。脑中记起了自己的目标,自己的希望还有自己最想念的人的面庞。革拉特一下子醒了过来。 他睁开眼睛,拔出自己的刀,跳出岩石。面对着狼群,他缓缓地举刀,指向狼群。他全身的血都沸腾了。杀气从他的刀上蹦射出来。 狼群中最大的一只全身金色的狼,高高的站在狼群后面的一快岩石上。它向革拉特望了一眼,然后头昂向天空发出一声长啸。啸声在狼群中激起一遍回应,狼群也跟着嚎叫起来。接着慢慢的向革拉特靠拢。 革拉特把刀横在胸前,然后举向天空,双腿往地上一蹬,嘴中发出一声咆哮。声音在旷野里传播开去。狼群也被怔得停住了前移的脚步。但是只是稍微迟疑了一下,又开始一边发出低沉的声音一边移动。革拉特缓缓闭上眼,一边用身体感受狼群的一举一动一边聚集力量。 狼群移动到到离革拉特2,3米多远的地方就停住了前进的脚步。都漏出白森森的牙齿,耸立着颈部的毛,不停地发出低沉的呜呜。。。” 革拉特却满脸镇定的神情,而且还透露出肃穆的感觉。 狼和人都等待着最后的时刻到来。。。。 萨德列顺着树枝的方向走着,一路上脑子里总想着那个奇怪的法师的事情,不知道怎么的自己对他特别的好奇。这么多年的经验告诉他在这个世界里好奇心有时会害死一个人。可他还是抑制不住。走着走着,他停了下来,因为直觉告诉他附近就有那个法师的信息。他走进路旁的一的小树林,在林子中间一副令他万分吃惊的景象出现在他面前。 旷野…. 狼群…. 人……一个坚定的人。 为首的那头金狼在岩石上转了几圈,然后停了下来。它用异样的眼神盯了盯前面的人。接着,又昂起头发出一声嚎叫。 战斗的号角已经吹响,战鼓也擂响。革拉特从听到狼王的嚎叫时刻,一直紧闭的双眼猛地撑开。手中的刀也开始抖动,发出“呜呜```````````”的鸣叫。 站在革拉特最前面的几头狼早就耐不住了,箭一般的向革拉特扑过来。 刀象天空的明月一样划出一道美丽的白光。 红色的血从半空中洒落下来。点点斑斑落在革拉特的脸上,身上。 革拉特吐出嘴里的血,象一头猛虎一样扑进狼群。从狼身上喷射出的血雨点般的打在他身上。热血的腥味刺激着他的神经,革拉特挥舞着手中的刀,自己已经分不清身上的血哪些是自己的哪些是狼的`````````` 在一望无尽的旷野上,一群狼和一个人构建了一幅罕见的奇观。狼的悲嚎,人的咆哮从旷野中央象涟漪一样散开。  革拉特已经开始气喘吁吁了,拼杀了一个多小时本来已经不多的体力已经快要透支了。而狼群却显得越来越多。革拉特周围,被杀死的狼都只剩下些骨头。这些狼为了自己把死了的或受伤的狼全吃了。革拉特身上也是伤痕累累。周围的狼不停地向他进攻。一次又一次地。前面的倒下了,后面的把尸体拖出去,又继续扑上来。 …呼…呼..不行了,我不行了。这些狼怎么都杀不完。我要放弃了。奇迹,奇迹我现在最需要的就是奇迹了。” “唰唰!”又是两刀,两头扑上来的狼被砍翻在地。突然背后钻心般的痛,革拉特急忙转过身,唰```一刀挥过去。却砍了个空,他仔细一看,原来是那头狼王。自己周围的其他狼都停止了向他进攻。只在他周围围出一个圈。狼王在他面前来回的走动。两只眼睛死死地盯着他。 “决斗吗??”革拉特心想。 周围的狼群不断地发出嚎叫,仿佛是在为狼王喝彩,加油。 革拉特明白了,狼王是要建立自己在狼群中的威信,要找他这个垂死的人来决斗。 革拉特把心一横。双手把刀握在手里,刀尖遥指狼王。他知道自己已经没有多少体力了,要和这只开始一直在旁观战的狡猾的狼王决斗,硬拼下去只有死。心里不断地想对策。 狼王在革拉特面前2,3米的地方来回的徘徊。两只眼睛却一刻也没离开过革拉特的一举一动。它在寻找空隙一直没有进攻。 一狼一人,在旷野中相互对峙着。周围狼群的嚎叫此起彼伏。突然革拉特向狼王冲了过去。就要冲到时,突然脚下一滑跌到在地上。狼王象绷紧的弹簧一样飞一般地射向革拉特。嘴准确地咬向革拉特的咽喉。 这个时候,狼群也全安静了下来,周围突然一下变得异常的安静。 血,从狼王的嘴边流了出来。。。。 周围的狼群发出胜利的嚎叫。 狼王一动也不动的趴在革拉特的身上,它的眼中充满了诧异的神情。 一狼一人都趴在地上半天一动不动,狼群也停止了嚎叫。一只灰狼从狼群中走出来。慢慢走近革拉特。突然,狼王从地上飞了出来。革拉特用刀艰难地站了起来。狼群一下子沸腾了。那只灰狼走到狼王的身边,嗅了嗅。然后回过身盯着革拉特。它走到革拉特身边,围着他转了几圈。然后向狼群发出一声长啸。本来围着革拉特的狼群开始散开。然后在灰狼的带领下向远方跑去。 狼群散尽。革拉特一下子倒在地上。看着身边狼王的尸体,回想起刚才的时刻,真是九死一生。他在狼王的牙齿快刺破自己颈部血管的一瞬间,把自己的左手塞进狼王的口中的同时右手把刀捅进狼王的心脏。现在手上几个血孔还在不住的冒血。他自己感到奇怪的是,现在自己居然没感到害怕,却有一种兴奋的感觉。 革拉特包扎了一下伤口,然后就躺在一快岩石后面睡了。

January 14, 2022 · 1 min · Luo Fei