数据保存与恢复
x <- c(22,23,23,24)
y <- mean(x)
#开环境:开始存储变量的数据
sink('./lis/mean_test.lis')
#将x,y存入mean_test.lis
x
y
#结束输出重定向到文件中
sink()
#代码续行:x为向量[11,22,3388]
x <- c(11,22,33+
+22+
+3333)
#向量叠加
assign("x",c(11,22,55))
c(x,111,x,222) -> y
math函数
x <- c(11,2,3388)
cos(x)
sin(x)
sum(x)
mean(x)
sqrt(x)
length(x)
sort(x)
序列seq
seq(1,5)#1,2,3,4,5
seq(1,5,2)#,1,3,5
seq(from=1,to=5,by=2)#1,3,5
seq(from=1,to=5,by=2)#1,3,5
seq(from=1,to=15,length.out = 3)#1,8,15
seq(from=2,along.with = c(1:5))#2,3,4,5,6
#along.with参数中序列的长度作为要产生序列的长度,序列内容对结果无影响
seq(from=2,by=2,along.with = c(1,2,5,8))#2,4,6,8
seq(from=2,by=2,along.with = c(1,2,3,8))#2,4,6,8
#序列中元素重复后拼接
x<-c(9,5,6)
rep(x,2)#9,5,6,9,5,6
rep(x,times = 3)#9,5,6,9,5,6,9,5,6
rep(x,each=2)#9,9,5,5,6,6
#->在控制台不显示结果的赋值
#<-在控制台显示结果的赋值
c(4,5,2)->x
x>4 -> y#FALSE TRUE FALSE
#无效值或缺失值NA、NaN
x<-c(1:4,NA,2:3)
is.na(x)
#字符串向量
z <- c("qq","zz")
#paste()接收任意参数,依次连接到字符串向量
#seq代表相隔字符,默认单个空格
paste(1:4)#"1" "2" "3" "4"
paste("a",1:6,seq="")#"a 1 " "a 2 " "a 3 " "a 4 " "a 5 " "a 6 "
paste("a",1:6)#"a 1" "a 2" "a 3" "a 4" "a 5" "a 6"
paste(c("a","b"),1:4,seq="")#"a 1 " "b 2 " "a 3 " "b 4 "
paste("today",date())#"today Sun Nov 20 19:25:58 2016"
索引向量
x<-c(11,22,33)
x[c(1,2,3,2,1)]#11 22 33 22 11
x[1:2]#11 22
x[-(1:2)]#33
names(x)<-c("一","二","三")#设置字符串下标索引
x[c("一")]#11
mode为对象集
#有numeric、complex、logical、character和raw
x<-c(11,22,3388)#11 22 3388
mode(x)#numeric
length(x)
as.character(x)#"11" "22" "3388"
a<-c(1.0-5i,29+88i)
mode(a)#complex
设置对象属性
h=c(5:12)
attr(h,"name")<- "hello"#分配h的name属性值为hello
因子和有序因子
my_num <- c(11,22,34,71,14,58,21,22)
factor(my_num) -> nums
#[1] 11 22 34 71 14 58 21 22
#Levels: 11 14 21 22 34 58 71
levels(nums)#"11" "14" "21" "22" "34" "58" "71"
ordered(nums)
#[1] 11 22 34 71 14 58 21 22
#Levels: 11 < 14 < 21 < 22 < 34 < 58 < 71
age <- c(25,12,15,12,25)
ordered(age,levels=c(25,12))
#[1] 25 12 12 25
#Levels: 25 < 12
score <-c(88,85,75,97,92,77,74,70,63,97)
cut(score,breaks=3)#分成三组
#[1] (85.7,97] (74.3,85.7] (74.3,85.7]
#[4] (85.7,97] (85.7,97] (74.3,85.7]
#[7] (63,74.3] (63,74.3] (63,74.3]
#[10] (85.7,97]
#Levels: (63,74.3] (74.3,85.7] (85.7,97]
循环语句
#for
z<-c()
x<-c(1:10)
y<-c(11:20)
for (i in 1:length(x)){
z[i]=x[i]^2+y[i]^2
}
z#122 148 178 212 250 292 338 388 442 500
#while
i = 1
while(x[i]^2<10){
i=i+1
x[i]=x[i]^2
}
x#1 4 3 4 5 6 7 8 9 10
条件语句
z<-c()
x<-c(1:10)
y<-c(11:20)
for(i in 1:length(x)){
if(x[i]^3>y[i]^2){
z[i]=x[i]^3
}else{
z[i]=y[i]^2
}
}
z#121 144 169 196 225 256 343 512 729 1000
R语言科学计算
分类(组)统计
#1、准备分组数据
fruit_class<-c("苹果","梨子","橘子","草莓","苹果","橘子","橘子","草莓","橘子","草莓")
fruit_prices<-c(3.5,2.5,1.5,5.5,4.2,3.2,2.8,4.8,2.9,5.8)
#2、平均价格统计
tapply(fruit_prices, fruit_class, mean)
#3、最低价格统计
tapply(fruit_prices, fruit_class, min)
#4、最高价格统计
tapply(fruit_prices, fruit_class, max)
#5、标准差统计
tapply(fruit_prices, fruit_class, sd)
#标准误(描述抽样误差):S/sqrt(n):S为样本的标准差
strerr <- function(x) sqrt(var(x)/length(x))
tapply(fruit_prices, fruit_class, strerr)
数组与矩阵基础
#1、数组与矩阵的维数
my_num<-c(1:9)#1 2 3 4 5 6 7 8 9
dim(my_num) <-c(3,3)
#my_num
# ````[,1] [,2] [,3]
# [1,] 1 4 7
# [2,] 2 5 8
# [3,] 3 6 9
###2、切片
c(my_num[1,2],my_num[2,3])# 4 8
###3、索引向量
x <- array(10:20,dim=c(2,5))
# [,1] [,2] [,3] [,4] [,5]
# [1,] 10 12 14 16 18
# [2,] 11 13 15 17 19
i <- array(c(1:3,5:4,3:5),dim=c(2,3))
# [,1] [,2] [,3]
# [1,] 1 3 4
# [2,] 2 5 3
x[i]#10 11 12 14 13 12
x[i]<-111
# [,1] [,2] [,3] [,4] [,5]
# [1,] 111 111 111 16 18
# [2,] 111 111 15 17 19
#4、array函数:根据dim对向量生成数组,列优先
c(1:20)->h
mya<-array(h,dim=c(4,5))
# 列优先 [,1] [,2] [,3] [,4] [,5]
# [1,] 1 5 9 13 17
# [2,] 2 6 10 14 18
# [3,] 3 7 11 15 19
# [4,] 4 8 12 16 20
#5、数组转换为向量
x<-array(c(1:10),dim=c(2,5))
as.vector(x)#c(1:10)
#6、matrix矩阵:数据,行数,列数,是否安行分配
matrix(c(1:10),2,5,TRUE)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 2 3 4 5
# [2,] 6 7 8 9 10
#7、对角矩阵
x<-diag(c(1:8))#对角线从1到8的8*8矩阵
diag(x)#提取对角线元素1到8
数组运算
#1、四则运算:数组对应元素进行运算
mya<-array(c(1:20),dim=c(2,10))
myb<-array(c(2),dim=c(2,10))
mya+myb
mya*myb
#2、向量连接
x2<-c(101:105)
x1<-c(1:10)
cbind(x1,x2)#向量行换为列再连接
# x1 x2
# [1,] 1 101
# [2,] 2 102
# [3,] 3 103
# [4,] 4 104
# [5,] 5 105
# [6,] 6 101
# [7,] 7 102
# [8,] 8 103
# [9,] 9 104
# [10,] 10 105
rbind(x1,x2)#列换为行再连接
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# x1 1 2 3 4 5 6 7 8 9 10
# x2 101 102 103 104 105 101 102 103 104 105
矩阵运算
#1、矩阵连接
x3<-matrix(c(1:4),2,2)
x4<-matrix(c(101:104),2,2)
cbind(x3,x4)
# [,1] [,2] [,3] [,4]
#[1,] 1 3 101 103
# [2,] 2 4 102 104
rbind(x3,x4)
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4
# [3,] 101 103
# [4,] 102 104
#2、矩阵转置:t(x),aperm(x,perm=c(1,2,3))
array(c(1:6),dim=c(2,3))->mya
t(mya)
#3、矩阵乘积%*%
a=array(c(1:4),dim=c(2,2))
b=array(c(5:8),dim=c(2,2))
a%*%b
# [,1] [,2]
# [1,] 23 31
# [2,] 34 46
#4、内积:矩阵内积即为矩阵乘积
##向量内积
a<-c(1:3)
b<-c(4:6)
crossprod(a,b)#32:1*4+2*5+3*6
##向量外积
a<-c(1:4)
b<-array(c(1:4),dim=c(4,1))
a%o%b
# [,1] [,2] [,3] [,4]
# [1,] 1 2 3 4
# [2,] 2 4 6 8
# [3,] 3 6 9 12
# [4,] 4 8 12 16
#5、求线性方程组:a%*%x=b中x的值
b=c(8:9)
a=array(c(1:4),dim = c(2,2))
solve(a,b)#-2.5 3.5
#6、矩阵求逆:solve(x)
array(c(1:4),dim=c(2,2))
solve(array(c(1:4),dim=c(2,2)))
# [,1] [,2]
# [1,] -2 1.5
# [2,] 1 -0.5
###7、矩阵特征值求解:eigen(x,symmetric,only.values=FALSE)
a<-array(c(1:16),dim=c(4,4))
eigen(a)
# $values
# [1] 3.620937e+01 -2.209373e+00 1.599839e-15
# [4] 7.166935e-16
# $vectors
# [,1] [,2] [,3] [,4]
# [1,] 0.4140028 0.82289268 -0.5477226 0.1125155
# [2,] 0.4688206 0.42193991 0.7302967 0.2495210
# [3,] 0.5236384 0.02098714 0.1825742 -0.8365883
# [4,] 0.5784562 -0.37996563 -0.3651484 0.4745519
#8、求解矩阵行列式
det(array(c(1:4),dim=c(2,2)))#-2
#9、奇异分解
a<-array(c(1:16),dim=c(4,4))
svd(a)
R语言计算实例
list:创建和读写数据
#1、创建学生数据集:list()
mystudents<-list(name="students",class="101",stdt.ages=c(22,24,20),stdt.name=c("zhangsan","lisi","wangwu"))
#2、读取列表
mystudents
#3、获取学生数据集的字段总数
length(mystudents)#4
#4、查看数据集中所有学生姓名和年龄
c(mystudents)
data.frame:更优的list
#1、创建data.frame,存学生数据
mysts<-data.frame(name=mystudents$stdt.name,age=mystudents$stdt.ages)
# name age
# 1 zhangsan 22
# 2 lisi 24
# 3 wangwu 20
#2、将年龄都增加一岁的操作步骤
#attach:字段副本绑定在搜索路径中
attach(mysts)
age+1->mysts$age
mysts
# name age
# 1 zhangsan 23
# 2 lisi 25
# 3 wangwu 21
# detach(mysts)
最小二乘法拟合
#lsift:
#x:行对应情况,列对应变量
#y:结果,可为矩阵
#Wt:可选参数,权重向量
#Intercept:是否使用截距项
#Tolerance:公差将用于矩阵分解
#Yname:用于响应变量名称
y<-c(2,4,6,8)
x<-c(1,2,3,4)
lsfit(x,y)##y=2x+0
# $coefficients
# Intercept X
# 0 2
交叉因子频率分析
#1、划分数据分布区间:cut(x,3):x向量分成3个区间
y<-c(11,22,13,14,11,22,31,31,31,14)
cut(y,5)->cuty
#2、使用table函数统计数据再每个区间出现的频率
table(cuty)# 5 0 2 0 3
#3、使用hist函数:生成分布直方图
bins<-seq(min(y),max(y),by=4)#生成序列
hist(y,breaks=bins,col = "lightblue",axes=FALSE)
axis(1,bins)#1代表x轴
axis(2)#2代表y轴
向量模长计算
#1、模长函数定义
vector_length<-function(x1,x2,x3){
vlength<-sqrt(x1^2+x2^2+x3^2)
vlength
}
#2、计算向量模长
vector_length(12,33,19)#39.92493
#3、n维向量模长计算
vector_length<-function(x){
temp<-0
for(i in 1:length(x)){
temp<-temp+x[i]^2
}
vlength<-sqrt(temp)
vlength
}
vector_length(c(11,22,33,44,55))#81.57818
欧氏距离:计数
mycount<-function(...){
temp<-0
for(i in c(...)){
temp=temp+1
}
temp
}
mycount(11,22,3,34,45)#5
统计分析基础
回归分析
#单变量线性回归
x<-c(5,7,9,11,16,20)
y<-c(1,2,3,4,7,9)
plot(x,y)#散点图
lsfit(x,y)#最小二乘法拟合
# $coefficients
#Intercept(截距) X(斜率)
# -1.8016529 0.5413223
# $residuals(残差)
# [1] 0.09504132 0.01239669 -0.07024793 -0.15289256
# [5] 0.14049587 -0.02479339
abline(lsfit(x,y))#绘制散点图和回归线
#lm:更详细的回归分析
lm(y~x)->xy
summary(xy)
#Estimate Std. Error t value Pr(>|t|):对斜率和截距
#估计值 估计标准差 假设检验t值 是否接受假设检验
#多元线性回归:lm函数
y=b0+b1x1+b2x2+...+bkxk+e
y<-c(5,7,9,11,16,20)
x<-c(1,2,3,4,7,9)
x2<-c(6,8,10,13,16,20)
lm(y~x+x2)->xy2
summary(xy2)
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 2.13846 0.30735 6.958 0.006091
# x 1.43077 0.10390 13.770 0.000829
# x2 0.24615 0.06111 4.028 0.027500
#非线性回归:非线性回归可通过变量变换变化为线性模型
#y=b0+b1x+b2x^2+...+bkx^k+e
#y=ae^(bx)等等非线性函数
x<-c(1,2,3,4,7,8,9)
y<-100+10*exp(x/2)+rnorm(x)
nlmod<-nls(y~Const+A*exp(B*x))
summary(nlmod)
# Estimate Std. Error t value Pr(>|t|)
# Const 99.265297 0.838620 118.37 3.06e-08 ***
# A 9.996232 0.175355 57.01 5.67e-07 ***
# B 0.500196 0.001932 258.89 1.34e-09 ***
# plot(x,y,main="nls(o)")#main为标题
# curve(100+10*exp(x/2),col=4,add=TRUE)#画实际方程
# lines(x,predict(nlmod),col=2,type = 'b')#画预测的回归线
数据分析
#1、区间频率分布
mag<-c(1.6,0.9,2.1,2.2,2.3,1.7,1.3,1.6,4.7,1.2,0.9,4.7,0.6,5.3,1.1,4.8,4,4.2,4.6,1.3,2.1,1.5,3)
magefactor<-factor(cut(mag,5))#分5区间
table(magefactor)#区间频率统计
hist(mag,breaks=5)#绘制直方图
#2、数据直方图:header表示文件头做变量名,seq是分隔符
earthquake<-read.table("eqweek.csv",header = TRUE,seq=",")
#3、数据散点图:
hist(mag)
rug(mag)
#4、五分位点#最大最小中位上下四分位
fivenum(mag)#0.6 1.3 2.1 4.1 5.3
#5、累积分布函数
mag_ecdf<-ecdf(mag)#计算累积分布
# Empirical CDF
# Call: ecdf(mag)
# x[1:18] = 0.6, 0.9, 1.1, ..., 4.8, 5.3
# plot(mag_ecdf,do.points=FALSE,verticals=TRUE)#绘制累积分布函数
#6、核密度估计:density
hist(mag,prob=TRUE)
lines(density(mag))
统计分析案例
绘图
#获取文件数据
jiuye<-read.table("csv/work.csv",header = TRUE,sep=",")
#筛选数据集中农业的数据:grepl(字符串匹配)
jyhy<-jiuye$行业名称[grepl("农业",jiuye$行业名称)]
jygz<-jiuye$平均劳动报酬[grepl("农业",jiuye$行业名称)]
names(jygz)<-jyhy#为数据设置变量名
#绘制点图
dotchart(jygz)
#绘制条形图
barplot(jygz,horiz = TRUE)
#绘制饼图
pie(jygz)
#茎叶图和箱型图
#茎叶图:stem(变量,scale=长度,width=绘图宽度,atom=容差)
cp<-read.table("csv/product.csv",header = TRUE,sep = ",")
stem(cp$单位成本.元.台.,scale=2)#个位数分成两段
#箱型图:boxplot
boxplot(jiuye$平均教育经费)#五分位点确定箱型图
评价值
#1、平均值
mean(jiuye$平均劳动报酬)#30203.17
#2、加权平均值
cp<-read.table("csv/product.csv",header = TRUE,sep = ",")
weighted.mean(cp$单位成本.元.台.,cp$产量.台.)#322.9051
#3、数据排序
sort(jiuye$平均教育经费)#42 44 143 196 230 308
sort(jiuye$平均教育经费,decreasing = TRUE)#308 230 196 143 44 42
#4、中位数
median(jiuye$平均教育经费)#169.5
#极差
max(jiuye$平均教育经费)-min(jiuye$平均教育经费)#266
#半极差
#quantile(jiuye$平均教育经费):四分位数
# 0% 25% 50% 75% 100%
# 42.00 68.75 169.50 221.50 308.00
#半极差即为上下四分位数之差
# IQR(jiuye$平均教育经费)#152.75
#方差
# var(jiuye$平均教育经费)#11153.5
#标准差
# sd(jiuye$平均教育经费)#105.6101
#变异系数:也称离散系数:标准差除以平均值
评价系数
#概率分布离散程度的归一化量度
# sd(jiuye$平均教育经费)/mean(jiuye$平均教育经费)#0.6580071
#样本平方和:样本校正平方和:样本与均值差的平方求和
# sum((jiuye$平均教育经费-mean(jiuye$平均教育经费))^2)#55767.5
#偏度系数:衡量实数随机变量概率分布的不对称性
# mymean<-mean(jiuye$平均教育经费)
# mysd<-sd(jiuye$平均教育经费)
# myn<-length(jiuye$平均教育经费)
# x<-jiuye$平均教育经费
# myn/((myn-1)*(myn-2))*sum((x-mymean)^3)/mysd^3#0.08632698
#峰度系数:衡量实数随机变量概率分布的峰态
#正态分布时,峰度系数为0
# mymean<-mean(jiuye$平均教育经费)
# mysd<-sd(jiuye$平均教育经费)
# myn<-length(jiuye$平均教育经费)
# x<-jiuye$平均教育经费
# ((myn*(myn+1))/((myn-1)*(myn-2)*(myn-3))*sum(x-mymean)^4)/mysd^4-(3*(myn-1)^2)/((myn-2)*(myn-3))#-6.25
##峰度系数越接近0,数据越接近正态分布!!!!
# cp<-read.table("csv/product.csv",header = TRUE,sep = ",")
# mymean<-mean(cp$序号)
# mysd<-sd(cp$序号)
# myn<-length(cp$序号)
# x<-cp$序号
# ((myn*(myn+1))/((myn-1)*(myn-2)*(myn-3))*sum(x-mymean)^4)/mysd^4-(3*(myn-1)^2)/((myn-2)*(myn-3))
##累积分布概率:pnorm
# mymean<-mean(cp$产量.台.)
# mysd<-sd(cp$产量.台.)
# myn<-length(cp$产量.台.)
# x<-cp$产量.台.
# pnorm(x,mymean,mysd)
# plot(x,pnorm(x,mymean,mysd))
##概率密度函数:dnorm(变量,平均值,标准差)
# mymean<-mean(cp$产量.台.)
# mysd<-sd(cp$产量.台.)
# myn<-length(cp$产量.台.)
# x<-cp$产量.台.
# dnorm(x,mymean,mysd)
# plot(x,dnorm(x,mymean,mysd))
##正态分布随机数:rnorm(长度,平均值,标准差)
# rx<-rnorm(50,0,1)
# plot(rx,dnorm(rx))
##分位点:qnorm(0.25,mean,sd)
# mymean<-mean(cp$产量.台.)
# mysd<-sd(cp$产量.台.)
# qnorm(0.25,mean=mymean,sd=mysd)#下25%分位点值
# plot(x,dnorm(x,mymean,mysd))
# abline(v=qnorm(0.25,mean=mymean,sd=mysd))#分位点划线
##频率直方图:hist
# hist(jiuye$平均劳动报酬,freq = TRUE)
##经验累积分布于正态分布
# plot(ecdf(jiuye$平均劳动报酬),verticals = TRUE,do.p=FALSE)
# lines(x,pnorm(x,mean(jiuye$平均劳动报酬),sd(jiuye$平均劳动报酬)),col="blue")
##正太检验与分布拟合
#QQ图:测试数据分布是否近似某种分布,正态分布近似于直线
# qqnorm(jiuye$平均劳动报酬)
# qqline(jiuye$平均劳动报酬)
#正态检验:W检验shapiro.test(),ks检验
# shapiro.test(cp$产量.台.)
#W = 0.8866, p-value = 0.3008:p值大于0.05,故认为产量正态分布
# ks.test(rnorm(80),rnorm(40))
#D = 0.15, p-value = 0.5725:p值大于0.05,可认为两分布为同一分布
# alternative hypothesis: two-sided
##其他还有很多分布在R语言中均有函数与其对应
模拟退火包使用
library("stats")
#读入csv数据
e<-read.csv("C:\\Users\\jerry123\\Documents\\R\\MyTest\\mle\\data.csv",header=F)
e<-e[1:1655,1]
T<-length(e)
BIGINT<-1000000
gamma<-1000
G<- function(gamma,c,t) (1+exp(-gamma*(t/T-c)))^(-1)
loglik<-function(param){
a0<-param[1]
deltaxing<-param[2]
c<-param[3]
ll=0
for(t in 1:T){
ll<-ll-1/2*log(a0+deltaxing*G(gamma,c,t))-1/2*e[t]^2/(a0+deltaxing*G(gamma,c,t))
ll<-ll+(min(a0+deltaxing*G(gamma,c,t),0))^2
}
ll<-ll+BIGINT*((min(1-c,0))^2+(min(c,0))^2)
return(ll)
}
set.seed(123)
res<-optim(par=c(2,2,0.8),fn=loglik,method = "SANN",control = list(maxit = 200))
summary(res)