【R函數學習】R語言時間序列函數整理

2021-02-21 R語言

【包】
library(zoo) #時間格式預處理
library(xts) #同上
library(timeSeires) #同上
library(urca) #進行單位根檢驗
library(tseries) #arma模型
library(fUnitRoots) #進行單位根檢驗
library(FinTS) #調用其中的自回歸檢驗函數
library(fGarch) #GARCH模型
library(nlme) #調用其中的gls函數
library(fArma) #進行擬合和檢驗

【基本函數】
數學函數
abs,sqrt:絕對值,平方根 log, log10, log2 , exp:對數與指數函數 sin,cos,tan,asin,acos,atan,atan2:三角函數 sinh,cosh,tanh,asinh,acosh,atanh:雙曲函數
簡單統計量
sum, mean, var, sd, min, max, range, median, IQR(四分位間距)等為統計量,sort,order,rank與排序有關,其它還有ave,fivenum,mad,quantile,stem等。


【數據處理】
#具體說明見文檔1
#轉成時間序列類型
x = rnorm(2)
charvec = c(「2010-01-01」,」2010-02-01」)
zoo(x,as.Date(charvec)) #包zoo
xts(x, as.Date(charvec)) #包xts
timeSeries(x,as.Date(charvec)) #包timeSeries
#規則的時間序列,數據在規定的時間間隔內出現
tm = ts(x,start = c(2010,1), frequency=12 ) #12為按月份,4為按季度,1為按年度
zm = zooreg(x,start = c(2010,1), frequency=12 ) #包zoo
xm = as.xts(tm) #包xts
sm = as.timeSeries(tm) #包timeSeries
#判斷是否為規則時間序列
is.regular(x)

#排序
zoo()和xts()會強制變換為正序(按照時間名稱)
timeSeries不會強制排序;其結果可以根據sort函數排序,也可以採用rev()函數進行逆序;參數recordIDs,可以給每個元素(行)標記一個ID,從而可以找回原來的順序

#預設的時間有重複的時間點時
zoo會報錯
xts按照升序排列
timeSeries把重複部分放置在尾部;

#行合併和列合併
#都是按照列名進行合併,列名不同的部分用NA代替
cbind()
rbind()
merge() 列合併

#取子集
xts()默認將向量做成了矩陣;其他與常規向量或者矩陣沒有差別

#缺失值處理
na.omit(x)
x[is.na(x)] = 0
x[is.na(x)] = mean(x,na.rm=TRUE)
x[is.na(x)] = median(x,na.rm=TRUE)
na.approx(x) #對缺失值進行線性插值
na.spline(x) #對缺失值進行樣條插值
na.locf(x) #末次觀測值結轉法
na.trim(x, sides=」left」 ) #去掉最後一個缺失值
#對timeSreies數據
na.omit(x, 「ir」 ) #去掉首末位置的缺失值
na.omit(x, 「iz」 ) #用替換首末位置的缺失值
na.omit(x, 「ie」 ) #對首末位置的缺失值進行插值
na.omit(x, method=「ie」, interp= c(「before」,」linear」,」after」) ) #可以選擇插值方法,before末次觀測值法,after下次觀測結轉法

as.contiguous(x) #返回x中最長的連續無缺失值的序列片段,如果有兩個等長的序列片段,則返回第一個。

#時間序列數據的顯示
#zoo和xts都只能按照原來的格式顯示,timeSeries可以設置顯示格式
print(x, format= 「%m/%d/%y %H:%M」) #%m表示月,%d表示天,%y表示年,%H表示時,%M表示分鐘,%A表示星期,%j表示天的序號
#timeSeries也可以按照ts的格式顯示
print(x, style=」ts」)
print(x, style=」ts」, by=」quarter」)

【圖形展示】
plot.zoo(x)
plot.xts(x)
plot.zoo(x, plot.type=」single」) #支持多個時間序列數據在一個圖中展示
plot(x, plot.type=」single」) #支持多個時間序列數據在一個圖中展示,僅對xts不行

【基本統計運算】
1、自相關係數、偏自相關係數等
例題2.1
d=scan("sha.csv")
sha=ts(d,start=1964,freq=1)
plot.ts(sha) #繪製時序圖
acf(sha,22) #繪製自相關圖,滯後期數22
pacf(sha,22) #繪製偏自相關圖,滯後期數22
corr=acf(sha,22) #保存相關係數
cov=acf(sha,22,type = "covariance") #保存協方差

2、同時繪製兩組數據的時序圖
d=read.csv("double.csv",header=F)
double=ts(d,start=1964,freq=1)
plot(double, plot.type = "multiple") #兩組數據兩個圖
plot(double, plot.type = "single") #兩組數據一個圖
plot(double, plot.type = "single",col=c("red","green"),lty=c(1,2)) #設置每組數據圖的顏色、曲線類型)

3、純隨機性檢驗
例題2.3續
d=scan("temp.csv")
temp=ts(d,freq=1,start=c(1949))
Box.test(temp, type="Ljung-Box",lag=6)

4、差分運算和滯後運算
diff
lag

5、模擬ARIMA模型的結果
arima.sim(n = 100, list(ar = 0.8))
plot.ts(arima.sim(n = 100, list(ar = 0.8))) #會隨機產生一個包含100個隨機數的時序圖
plot.ts(arima.sim(n = 100, list(ar = -1.1))) #非平穩,無法得到時序圖。
plot.ts(arima.sim(n = 100, list(ar = c(1,-0.5))))
plot.ts(arima.sim(n = 100, list(ar = c(1,0.5))))
arima.sim(n = 1000, list(ar = 0.5, ma = -0.8))
acf(arima.sim(n = 1000, list(ar = 0.5, ma = -0.8)),20)
pacf(arima.sim(n = 1000, list(ar = 0.5, ma = -0.8)),20)

【單位根檢驗】
#方法1
b=ts(read.csv("6_1.csv",header=T))
x=b[,1]
y=b[,1]
summary(ur.df(x,type="trend",selectlags="AIC"))
#方法2:單位根檢驗更好的函數,加了畫圖的功能
library(fUnitRoots)
urdfTest(x)
#方法3:ADF檢驗的一個自編函數
library(urca)
#...
ur.df.01=function(x,lags=8){
#將三種ADF檢驗形式匯總的函數(結果和EVIEWS不一致)
res=matrix(0,5,3)
colnames(res)=c("無","含常數項","含常數項和趨勢項")
rownames(res)=c("tau統計量","1%臨界值","5%臨界值",
"10%臨界值","是否穩定(1/0)")
types=c("none","drift","trend")
for(i in 1:3){
x.adf=ur.df(x,type=types[i],lags=lags,selectlags="AIC")
x.adf.1=x.adf@teststat #統計量
x.adf.2=x.adf@cval #臨界值
res[1,i] =x.adf.1[1]
res[2:4,i]=x.adf.2[1,]
res[5,i]=if( abs(res[1,i]) > abs(res[3,i]) ) 1 else 0
}
return(res)
}
#...
ur.df.01(x) #對原序列進行判斷

【一般的ARIMA模型】
d=scan("a1.5.txt") #導入數據
prop=ts(d,start=1950,freq=1) #轉化為時間序列數據
plot(prop) #作時序圖
acf(prop,12) #作自相關圖,拖尾
pacf(prop,12) #作偏自相關圖,1階截尾
Box.test(prop, type="Ljung-Box",lag=6)
#純隨機性檢驗,p值小於5%,序列為非白噪聲
Box.test(prop, type="Ljung-Box",lag=12)
( m1=arima(prop, order = c(1,0,0),method="ML") ) #用AR(1)模型擬合,如參數method="CSS",估計方法為條件最小二乘法,用條件最小二乘法時,不顯示AIC。
( m2=arima(prop, order = c(1,0,0),method="ML", include.mean = F) ) #用AR(1)模型擬合,不含截距項。
tsdiag(m1) #對估計進行診斷,判斷殘差是否為白噪聲
summary(m1)
r=m1$residuals #用r來保存殘差
Box.test(r,type="Ljung-Box",lag=6, fitdf=1)#對殘差進行純隨機性檢驗,fitdf表示殘差減少的自由度
AutocorTest(m1$resid) #加載FinTS包,進行自相關檢驗
prop.fore = predict(m1, n.ahead =5) #將未來5期預測值保存在prop.fore變量中
U = prop.fore$pred + 1.96* prop.fore$se #會自動產生方差
L = prop.fore$pred – 1.96* prop.fore$se #算出95%置信區間
ts.plot(prop, prop.fore$pred, col=1:2) #作時序圖,含預測。
lines(U, col="blue", lty="dashed")
lines(L, col="blue", lty="dashed")#在時序圖中作出95%置信區間

——說明:運行命令arima(prop, order = c(1,0,0),method="ML")之後,顯示:
Call:
arima(x = prop, order = c(1, 0, 0), method = "ML")
Coefficients:
ar1 intercept
0.6914 81.5509
s.e. 0.0989 1.7453
sigma^2 estimated as 15.51: log likelihood = -137.02, aic = 280.05
注意:intercept下面的81.5509是均值,而不是截距!雖然intercept是截距的意思,這裡如果用mean會更好。(the mean and the intercept are the same only when there is no AR term,均值和截距是相同的,只有在沒有AR項的時候)
如果想得到截距,利用公式計算。int=(1-0.6914)*81.5509= 25.16661。

——說明:Box.test(r,type="Ljung-Box",lag=6,fitdf=1)
fitdf表示p+q,number of degrees of freedom to be subtracted if x is a series of residuals,當檢驗的序列是殘差到時候,需要加上命令fitdf,表示減去的自由度。
運行Box.test(r,type="Ljung-Box",lag=6,fitdf=1)後,顯示的結果:
Box.test(r,type="Ljung-Box",lag=6,fitdf=1)
Box-Ljung test
data: r
X-squared = 5.8661, df = 5, p-value = 0.3195
「df = 5」表示自由度為5,由於參數lag=6,所以是滯後6期的檢驗。

#另一個參數估計與檢驗的方法(加載fArma程序包)
ue=ts(scan("unemployment.txt"),start=1962,f=4) #讀取數據
due=diff(ue)
ddue=diff(due,lag=4)
fit2=armaFit(~arima(4,0,0),include.mean=F,data=ddue,method="ML") #另一種擬合函數
summary(fit2)
fit3=armaFit(~arima(4,0,0),data=ddue,transform.pars=F,fixed=c(NA,0,0,NA),include.mean=F,method="CSS")
summary(fit3)

【一些特殊的模型】
#固定某些係數的值
arima(dw,order=c(4,0,0),fixed=c(NA,0,0,NA,0),method="CSS")

#乘積季節模型
wue=ts(scan("wue.txt"),start=1948,f=12)
arima(wue,order=c(1,1,1),seasonal=list(order=c(0,1,1),period=12),include.mean=F,method="CSS")

#擬合自回歸模型,因變量關於時間的回歸模型
eg1=ts(scan("582.txt"))
ts.plot(eg1)
fit.gls=gls(eg1~-1+time(eg1), correlation=corARMA(p=1), method="ML") #看nlme包
summary(fit.gls2)
#或
fit=arima(eg1,c(1,0,0),xreg=time(eg1),include.mean=F,method="ML")
AutocorTest(fit$resid) #殘差白噪聲檢驗

#延遲因變量回歸模型
leg1=lag(eg1,-1)
y=cbind(eg1,leg1)
fit=arima(y[,1],c(0,0,0),xreg=y[,2],include.mean=F)

#擬合GARCH模型
library(tseries)
library(fGarch)
library(FinTS)
a=ts(scan("583.txt"))
ts.plot(a)
fit=lm(a~-1+time(a))
r=resid(fit)
summary(fit)
pacf(r^2)
acf(r)
acf(r^2)
AutocorTest(r) #殘差是否存在序列相關
ArchTest(r) #是否存在ARCH效應
fit1=garchFit(~arma(2,0)+garch(1,1), data=r, algorithm="nlminb+nm",
trace=F, include.mean=F)
summary(fit1)

#協整檢驗
fit=arima(b[,2],xreg=b[,1],method="CSS")
r=resid(fit)
summary(ur.df(r,type="drift",lag=1))
Box.test(r,lag=6,fitdf=1)



【自動運行的自編函數】
acf.3(x) #同時繪製3個相關圖,acf函數的擴展
ur.df.01(x) #進行單位根檢驗,得到更加舒服的結果
tsdiag2(x) #返回x的
arma.choose(x,ari=3,mai=3) #選擇合適的AR和MA,基於包tseries的arma函數



#########################附屬自編函數
#...
acf.3=function(x,lag.max=10,…){
ol=par(mfrow=c(3,1),mar=c(2,4,1,1))
acf(x,lag.max=lag.max,type="correlation")
acf(x,lag.max= lag.max,type="covariance")
acf(x,lag.max= lag.max,type="partial")
par(ol)
}
#...
#...類似於tsgiag函數的擴展
tsdiag2=function(xx.model,fitdf=0,testlag=10){
t1=xx.arma$residuals
t2=acf(na.omit(t1),plot=F)
t3=sapply(1:testlag,
function(x,r,fitdf){
Box.test(r,type="Ljung-Box",lag=x, fitdf=fitdf)
},
r=t1,fitdf=fitdf)
par(mfrow=c(3,1))
plot(t1,type="b",ylab="",main="殘差走勢")
lines(c(0,length(t1)*2),c(0,0),col=2,lty=2)
plot(t2,type="h",ylab="ACF",main="殘差的自相關係數")
plot(do.call("c",t3[3,]),type="p",ylab="P-value",pch=16,col=4,
ylim=c(0,1),main="殘差的Ljung-Box檢驗")
lines(c(0,attr(t1,"tsp")[2]),c(0.05,0.05),lty=2,col=2)
}
#...
ur.df.01=function(x,lags=8){
#將三種ADF檢驗形式匯總的函數(結果和EVIEWS不一致)
res=matrix(0,5,3)
colnames(res)=c("無","含常數項","含常數項和趨勢項")
rownames(res)=c("tau統計量","1%臨界值","5%臨界值",
"10%臨界值","是否穩定(1/0)")
types=c("none","drift","trend")
for(i in 1:3){
x.adf=ur.df(x,type=types[i],lags=lags,selectlags="AIC")
x.adf.1=x.adf@teststat #統計量
x.adf.2=x.adf@cval #臨界值
res[1,i] =x.adf.1[1]
res[2:4,i]=x.adf.2[1,]
res[5,i]=if( !is.nan(res[1,i]) & abs(res[1,i]) > abs(res[3,i]) ) 1 else 0
}
return(res)
}
#...
#...
arma.choose.02=function(x){
#二進位進位運算,以矩陣形式,x=c(0,1,0,1,...)
n=length(x)
if( all(!as.logical(x-rep(1,n))) ) stop("已不能再加1!")
x[1]=x[1]+1
for(i in 1:(n-1)) if(x[i]>1){ x[i]=0;x[i+1]=x[i+1]+1 }
return(x)
}
arma.choose.01=function(ti){
#把ti變換成所有可能的ti個0或1的組合
if(ti<0) stop("ti要大於0!")
if(ti==0) return(0)
if(ti%%1!=0) stop("ti要整數!")
res=matrix(0,2^ti,ti)
for(i in 2:2^ti) res[i,]=arma.choose.02(res[i-1,])
return(res)
}
arma.choose.03=function(t0){
gsub(", ",".",toString(t0,sep=""))
}
arma.choose.04=function(i,ari,tti){
#ari是最大滯後期,tti由ari生成
ar.lag=((1:ari)*tti[i,])
ar.lag=ar.lag[ar.lag!=0]
ar.lag
}
arma.choose=function(x,ari=3,mai=3,...){
tti=arma.choose.01(ari)
ttj=arma.choose.01(mai)
ti=2^ari;tj=2^mai
res.aic=matrix(Inf,ti,tj) #保存所有組合的AIC
rownames(res.aic)=paste("AR",apply(tti,1,arma.choose.03),sep=".")
colnames(res.aic)=paste("MA",apply(ttj,1,arma.choose.03),sep=".")
res.rss=matrix(Inf,ti,tj) #保存所有組合的RSS
rownames(res.rss)=paste("AR",apply(tti,1,arma.choose.03),sep=".")
colnames(res.rss)=paste("MA",apply(ttj,1,arma.choose.03),sep=".")
for(i in 2:ti){
j=1
ar.lag=arma.choose.04(i,ari,tti)
x.arma=arma(x,lag=list(ar=ar.lag),...)
ss=summary(x.arma)
res.aic[i,j]=ss$aic
res.rss[i,j]=sum(ss$residuals^2)
}
for(j in 2:tj){
i=1
ma.lag=arma.choose.04(j,mai,ttj)
x.arma=arma(x,lag=list(ma=ma.lag),...)
ss=summary(x.arma)
res.aic[i,j]=ss$aic
res.rss[i,j]=sum(ss$residuals^2)
}
for(i in 2:ti){for(j in 2:tj){
ar.lag=arma.choose.04(i,ari,tti)
ma.lag=arma.choose.04(j,mai,ttj)
x.arma=arma(x,lag=list(ar=ar.lag,ma=ma.lag),...)
ss=summary(x.arma)
res.aic[i,j]=ss$aic
res.rss[i,j]=sum(ss$residuals^2)
}}
res=list()
res[["tt.ar"]]=tti
res[["tt.ma"]]=ttj
temp1=which.min(res.aic) #找到最小的位置,把res.aic當做按列排的向量
temp2=temp1 %% ti #ti是行數,取餘以後就是(temp2)行號
#AR可以直接被arma調用,MA同理
res[["AR"]]=if(temp2==0) arma.choose.04(ti,ari,tti) else arma.choose.04(temp2,ari,tti)
res[["MA"]]=arma.choose.04( ceiling( temp1 / ti ), mai,ttj)
res[["aic"]]=res.aic
res[["rss"]]=res.rss
res
}

#

相關焦點

  • R語言時間序列函數大全(收藏!)
    )) #包timeSeries#規則的時間序列,數據在規定的時間間隔內出現tm = ts(x,start = c(2010,1), frequency=12 ) #12為按月份,4為按季度,1為按年度zm = zooreg(x,start = c(2010,1), frequency=12 ) #包zooxm
  • 我的R語言學習方法
    1)為什麼要學習R語言,即學習R語言的目的和動機2)怎麼學習R語言,即學習R語言舉措和行動3)要學習R語言的什麼,即學習的結果和成果給大家一分鐘時間,大家可以思考一下,可以把答案在後面留言或者進入R語言公眾號,加入群,一起討論。我說一下自己的Why-How-What。
  • 如何入門R語言
    這使得我們R語言學習不再是漫無目的的遊擊戰,而是需求明確的精準打擊。在花了一個禮拜刷了《R語言實戰》的前五章後,我認為我掌握了R基本的數據結構和一些比較常用的函數(這個時候我已經基本拋棄Excel了),然後我就根據每個禮拜的作業題開始跳躍性地學習了。這個過程很痛苦,但也很愉悅。
  • DataFrame(10):數據轉換——map()函數的使用
    1)map()函數作用將序列中的每一個元素,輸入函數,最後將映射後的每個值返回合併,得到一個迭代器。2)map()函數原理圖原理解釋:上圖有一個列表,元素分別是從1-9。map()函數的作用就是,依次從這個列表中取出每一個元素,然後放到f(x)函數中,最終得到一個通過函數映射後的結果。3)map()內置函數和Series的map()方法① map作為python內置函數的用法
  • 如何學習好R語言?【全套R語音書籍+視頻下載】
    包括了閱讀經典的教材、代碼、論文、學習公開課。 - 通過牛人來學習。 包括同行的聚會、討論、大牛的博客、微博、twitter、RSS。 - 通過練習來學習。 包括代碼練習題、參加kaggle比賽、解決實際工作中的難題。 - 通過分享來學習。 包括自己寫筆記、寫博客、寫書、翻譯書,和同伴分享交流、培訓新人。# 全套R語音書籍下載。關注公眾號後,回覆:R語言
  • 【C語言】什麼是 lvalue,什麼是 rvalue?
    隨著學習的深入,你會經常看到 lvalue 這個詞。一般出現在諸如各種、書籍中,更頻繁遇到的是在你的錯誤提示中:一般你會看到這個是因為你的代碼這麼寫:……        int i;        5 = i;……一些朋友想當然的就覺得 lvalue 指的就是賦值運算符左邊的那個值,而 rvalue 當然就是右邊那個值啦。
  • 「R」用purrr實現迭代
    本文來源於 2018 年學習《R for Data Science》寫的筆記。一起複習一下吧~函數有3個好處:除了函數,減少重複代碼的另一種工具是迭代,它的作用在於可以對多個輸入執行同一種處理,比如對多個列或多個數據集進行同樣的操作。
  • 最全的 R 語言學習路線在這裡,讓你少走彎路!
    現在對R感興趣的人越來越多,很多人都想快速的掌握R語言,然而,由於目前大部分高校都沒有開設R語言課程,這就導致很多人不知道如何著手學習
  • C語言 | 求圓周長 面積 表面積 體積
    「要成為絕世高手,並非一朝一夕,除非是天生武學奇才,但是這種人…萬中無一」這道理放在C語言學習上也一併受用
  • Excel日期及時間函數——DATEVALUE函數
    DATEVALUE函數概念及語法DATEVALUE函數概念:將日期值從字符串轉化為序列數,表示日期時間代碼的日期;DATEVALUE 函數將存儲為文本的日期轉換為 Excel 識別為日期的序列號。 例如,公式=DATEVALUE("1/1/2008") 返回 39448,即日期 2008-1-1 的序列號。
  • 討論學習R的grepl函數,附入群方式
    為了方便大家交流學習,共同進步,我特地創建了微信交流群長按二維碼加入「生信交流群」或後臺留言「生信交流群」入群實現的手段就是通過R的grepl函數    這個函數裡的pattern是匹配的模式,也就是我們經常聽到的正則表達式。如果對正則表達式還不了解的小夥伴,可以參考☞正則表達式☜。
  • R語言讀取xlsx文件
    不管是txt文本文件,還是csv逗號分割符文件,都是可用R自帶函數讀取的,即使對於一般不太大的文件,我們可以將其打開另存為csv文件,當然了,Excel對於超過100萬條的數據,也不一定是100萬條,這與每一行數據量多少還是有關的,我是沒有見過幾百萬條的Excel文件的,xlsx表格文件一般是拿來做商務報表的,應該沒有幾百萬行的數據吧!
  • 教您用R語言畫直方圖!| 繽紛燦爛R語言 | 醫學方R語言高階課程
    這三步是為了找到x軸的取值範圍plot(h1, ylim=c(hmin, hmax), col="green", xlim=c(xmin, xmax))lines(h2, col="blue")#注意,用低級繪圖函數
  • DataFrame(12):數據轉換——apply(),applymap()函數的使用
    id=3943f6b14c322e683fb2fe3bfdd11f63&sub=06345554A2234845B796B525E76697ED  2)apply()函數作用於Series① 案例一:1代表男,0代表女,完成如下替換df = pd.read_excel(r"C:\Users\黃偉\Desktop\test.xlsx",sheet_name=3)
  • 《R語言實戰》菜雞筆記(八):回歸
    Income + Frost, data=data_1)qqPlot(fit_4, labels=row.names(data_1), id.method="identify", simulate=TRUE, main="Q-Q Plot") data_1["Nevada",]fitted(fit_4)["Nevada" ] residuals(fit_4)["Nevada"] rstudent
  • 學習c語言筆記——C庫函數printf()
    c語言中的printf是什麼來的?」。我答:「它是一個函數,主要用來輸出運算結果。」 ,下面就給大家介紹C庫函數printf()使用方法。下面我們通過一個調用c庫函數的c語言案例來說明printf()函數的使用方法,如c語言1。
  • R語言卡方檢驗|問卷的交叉分析
    讓我們以狗熊會精心整理的脫單情況問卷中「社交小團體和自己單身情況之間的關係」為例,來演示一下吧!整體思路:首先將要分析的兩個變量用列聯表整合;其次對其進行卡方檢驗,得到檢驗結果顯著後,再對各單元格的狀況進行殘差分析,最後得出結論。列聯表就是兩個分類變量的頻數分布表。計算出列聯表後,觀察各個單元格的頻數。根據單元格的頻數,選擇正確的檢驗方法和函數參數設置。
  • DataFrame(11):數據轉換——apply(),applymap()函數的使用
    1、apply()函數1)apply()函數作用① apply()函數作用於Series和Series的map()方法作用是一樣的,依次取出Series中的每一個元素作為參數,傳遞給function函數,進行一次轉換。
  • 蒙特卡洛方法-練習使用概率密度函數
    簡介先前的文章我們了解了概率密度函數是何物,現在開始來練習一下概率密度函數。
  • 用R語言讀取EXCEL文件的方法
    為了解決這一尷尬的問題,下面我就教一下大家怎麼用統計專業的R語言來讀取數據(數據處理之前很重要的一個步驟)        用R讀取excel文件中的數據,需要先搭建一個Java的環境(配置好JDK),然後再用 install.packages("xlsx") 指令導入相關的包(常見的Excel文件格式是xlsx,而處理xlsx文件這個包是使用Java語言來寫的