R语言中的数学运算-最全总结+解惑

2019.09.10更新,新增一阶导数、二阶导数和偏导数计算

一、算术运算符

^或**  乘方,求幂值
A%%B   取余,模运算
A%/%B  整数除法
==     严格等于,判断是否相等
!x     不等于x
x|y    或,&或|比较两个向量的所有元素
x&y    与
sign() 判断正负
&&或|| 逻辑计算操作,只比较两个向量的第一个元素
xor    异或

二、数值与字符处理函数

ceiling(x)  #不小于x的最小整数
floor(x)    #不大于x的最大整数
trunc(x)    #截取整数部分
round(x,digits=n)   #将x舍入指定位的小数(四舍五入),默认无小数
signif(x,digits=n)    #将x舍入指定位的有效数字(四舍五入)
log(x)      #取自然对数
log(x,base=n)  #对x取以n为底的对数
exp() #以自然常数e为底的指数函数
sqrt() #平方根

isTRUE() #判断是否TRUE
#精确比较两个对象
identical(1,as.integer(1))


#计算自定义概率的样本分位数
quantile(x,probs,names=T,type=1-9)  #求分位数,x为待求分位数的数值型向量,probs为[0,1]之间概率值组成的数值型向量,type=1-9共有9种分位数算法选择
fivenum(x)  #求取5个分位值,等价于quantile(x,names=F,type=1)
range(x)    #求值域,range(c(1,2,3,4)) 为c(1,4)
diff(x,lag=n)  #对x求差分,lag指定滞后的阶数
weight.mean(d,c(1,2,4,5,6)) #加权求平均值
prod(1:5) #连乘
factorial(5) #阶乘函数5!
median(x) #中位数
any(x>5) #任意条件any
all(x>5) #全体条件all
choose(5,2) #从5个中选出2个,共有几种选法

combn()  #用于产生集合元素的组合,例如找出集合1,2,3中含有两个元素的子集,输出结果是按列排列的矩阵
combn(1:3,2) #输出的结果按列排序,类型为矩阵

cumsum(1:5) #累加
cumprod(1:5) #累乘
cummin(x) #最小累积,相当于从左到右依次取变量最小值
cummax(x) #最大累积,相当于从左到右依次取变量最大值

intersect(x,y) #取交集
union(x,y) #取并集
setdiff(x,y) #取差集,从x中排出y
setequal(x,y) #判断两个向量是否相等
unique(x) #取唯一值
which(duplicated(x)) #找到重复元素的索引
#duplicated()函数是从数据框中取出重复的数据,如果是将重复的数据删除
Kpil<-exceldata[!duplicated(exceldata[,c(“tian”,”yin”)])];

pmin()\pmax() #把多个等长度的向量按元素逐一对比,并返回所有向量的第k个元素中最小或最大的值


scale(x,center=TRUE,scale=F)  #为数据对象x按列进行中心化(即减平均值)
scale(x,center=TRUE,scale=T)  #或者标准化(均值为0,标准差为1)
#如果要对每一列进行任意均值和标准差的标准化
scale(x,center=TRUE,scale=TRUE)*sd+M

三、复杂数学函数

1.三角函数
sec() #正割,斜边与邻边的比值
csc() #余割,斜边与对边的比值
tan() #正切,对边与邻边的比值
2.内积与外积
#x,y均为向量,计算两个向量的内积(数量积,点积,标积)表示方法:x.y=|x|*|y|*cos(x,y),其中|x|表示向量大小sqrt(sum(x**2))
crossprod(x,y) 或 x %*% y
#向量外积定义:即向量积,矢积,叉积,记a×b.若a、b不共线,则a×b的模是:
|a×b∣=|a|·|b|·sin(a,b);a×b的方向遵守右手定则:垂直于a和b,且a、b和a×b按这个次序构成右手系.若a、b共线,则a×b=0
x %o% y 或 tcrossprod(x,y)
3.如果需要求函数的最大值和最小值,需要nlm()和optim()函数.例如如果求f(x)=x^2+sin(x)的最小值
nlm(function(x) return(x^2+sin(x)),8)
其中输出$minimum最小值,$estimate横轴x的取值,$iterations迭代的次数,8设定的初始值

四、精确、部分和完全匹配

which(x %in% y)  #找出x在y中存在元素的索引
1.精确匹配:items %in% c('A','B')表示items中,item='A' or item='B'
2.%pin%是部分匹配,只要item like '%A%' or item like '%B%'
3.%ain%是完全匹配,itemset has ’A' and itemset has ’B'
注:2,3是基于arules包

五、复数计算

复数是实数的延伸,使得任意多项式都有根

x<-5+2i; #直接创建复数
x<-complex(real=5,imaginary=2); #通过complex函数创建
Re(x); #实部
Im(x); #虚部
Conj(x) #取轭,输出5-2i
Arg(x) #取辐角
Mod(x); #取模

#负数开平方根,必须在复数域内进行
sqrt(complex(real=-9))

六、方程计算

主要介绍一元多次方程与两元一次方程的解法:

#一元一次方程:ax+b=0,设a=5,b=10,求x
f1<-function(x,a,b) a*x+b
a<-5
b<-10
#在-10到10的区间,精确度为0.00001
result<-uniroot(f1,c(-10,10),a=a,b=b,tol=0.00001)
result$root

#一元多次方程同理,由于uniroot()函数每次只能计算一个根,而且需要输入的区间端点必须满足函数f()的值在极点边是正负号相反的,否则会出现错误,所以要取不同的区间来获取方程的根,区间可以使用图形来支撑
x<-seq(-5,5,by=0.01);
y<-f1(x,a,b);
df<-data.frame(x,y);
g<-ggplot(df,aes(x,y));
g<-g+geom_line(col=’red’);	#红色曲线
g<-g+geom_vline(yintercept=0)+geom_hline(yintercept=0);	#坐标轴
g<-g+ggtitle(paste(“y=”,a,”*x+”,b));

#二元一次方程组求解,利用了矩阵运算
3x1+5x2=5;
X1+2x2=1
#代码实现
lf<-matrix(c(3,5,1,2),nrow=2,byrow=TRUE);
rf<-matrix(c(5,1),nrow=2);
result<-solve(lf,rf);
#多元一次方程均可以使用以上方法,当然也可以从图形中得到解,y=x2,x=x1
fy1<-function(x) (5-3x1)/5;
fy2<-function(x) (1-x1)/2;
x<-seq(-1,4,by=0.01);
y1<-fy1(x);y2<-fy2(x);
dy1<-data.frame(x,y=y1,type=paste(“dy1”));
dy2<-data.frame(x,y=y2,type=paste(“dy2”));
df<-rbind(dy1,dy2);
g<-ggplot(df,aes(x,y));
g<-g+geom_line(col=type,stat=’identity’);
g<-g+geom_vline(yintercept=0)+geom_hline(yintercept=0);

七、随机数与抽样模拟

1.设定随机数种子

每次生成伪随机数时,函数都会使用一个不同的种子,也就会产生不同的随机数结果,使用set.seed()显式指定这个种子,可以让结果重现

均匀分布随机数runif(n,min=,max=);如果省略min和max则表示[0,1]上均匀分布随机数,生成n个随机数

2.随机抽样

放回与无放回抽样sample(x,n,replace=T,prob=null)其中x表示抽样样本的总体(总体向量,可以是字符型、数字型、逻辑型等);n表示样本容量,即抽样几次;replace=F,默认为无放回抽样;prob可以设置每个不同的入样单元的入样概率,进行不等概率抽样

3.组合的模拟

从20个人中选出人数为3,4,5的三个委员会,A和B被选入同一个委员会的概率有多大--模拟

choosecomm<-function(comdat,comsize){
committee<-sample(comdat$whosleft,comsize)
#定义AB为1:2的序号
comdat$numabchosen<-length(intersect(1:2,committee))
if(comdat$numabchosen==2)
   comdat$countabsamecomm<-comdat$countabsamecomm+1
   comdat$whosleft<-setdiff(comdat$whosleft,committee)
   return(comdat)
}

sim<-function(nreps){
commdata<-list()
commdata$countabsamecomm<-0
for (rep in 1:nreps){
commdata$whosleft<-1:20
commdata$numabchosen<-0
commdata<-choosecomm(commdata,5)
if (commdata$numabchosen>0) next
commdata<-choosecomm(commdata,4)
if (commdata$numabchosen>0) next
commdata<-choosecomm(commdata,3)
}
print(commdata$countabsamecomm/nreps)
}

#如果用解析的方法,如下概率0.1
(choose(18,1)*choose(17,4)*choose(13,5)+choose(18,2)*choose(16,3)*choose(13,5)+choose(18,3)*choose(15,3)*choose(12,4))/(choose(20,3)*choose(17,4)*choose(13,5))

八、描述性统计分析

数值型数据的描述性分析:mean() sd() var() median();在R中还提供了fivenum()和summary()来求出分位数(最大值、最小值、分位数和数值型变量均值)

众数计算:

names(which.max(table(x))) #x为数值型向量

R语言中的数学运算-最全总结+解惑_第1张图片

#计算峰度和偏度的函数:
Mtcarss<-function(x,na.omit=FALSE){
if(na.omit)
x<-x[!is.na(x)];   #返回非空的x
m<-mean(x);
n<-length(x);
s<-sd(x);
skew<-sum((x-m)^3/s^3)/n;
kurt<-sum((x-m)^4/s^4)/n-3;
return(c(n,m,s,skew,kurt));
}

mean(salary,trim=0.2) 截尾均值,表示对salary字段的两头都截去20%的均值,trim的取值范围为0-0.5

对数值数据进行分组:使用cut函数对数值数据进行分组

salary.cut<-cut(salary,breaks=c(1000,2000,3000,max(salary)))

九、协方差与协方差矩阵

协方差是反映两个随机变量相关程度的指标(衡量两个随机变量的总体误差),协方差大于0的时候表示两者正相关,小于0的时候表示两者负相关,但是协方差值的大小并不能很好地度量两个随机变量的关联程度

R语言中的数学运算-最全总结+解惑_第2张图片

cov(x,y) #协方差,x和y的向量维数必须相等
#计算方差或者协方差矩阵(它的每个元素是各个向量之间的协方差)
cov(x) #协方差矩阵,x为矩阵或者数据框

十、标准误与变异系数

R语言中的数学运算-最全总结+解惑_第3张图片

十一、一阶导数计算

R语言中的数学运算-最全总结+解惑_第4张图片

#deriv(expr,name)函数(两个参数,第一个参数为原函数公式,用~分隔公式两边,第二个参数指定函数自变量)
dx<-deriv(y~x^3,"x")	#生成导数公式
mode(dx)	#输出expression-变量类型
x<-1:2	#给自变量x赋值
#R语言计算过程(梯度下降法计算一阶导数)与手动计算不同(通过给定的导数计算公式)
eval(dx)	#运行求导计算

#如果希望以函数形式调用公式(不改变计算结果)需对deriv函数传第三个参数func=TRUE
dx<-deriv(y~sin(x),"x",func=TRUE)	#生成导数公式的计算函数
mode(dx)	#返回function
dx(c(pi,pi/4))

#指数函数导数
dx<-deriv(y~4^x,"x",func=TRUE)
dx(2)

#对数函数导数,R语言编程只能计算以自然常数为底的对数函数的导数(对于非自然常数为底的对数,需要变换后再进行导数计算),换底公式log2X=lnx/ln2
dx<-deriv(y~log(x)/log(2),"x",func=TRUE)

十二、二阶导数计算

对一个函数进行多次连续求导运算,会形成高阶导数(函数y=f(x)的导数仍然是x的函数)。二阶导数的计算可手动划分成两次求导进行计算,也直接用deriv3函数合并成一步计算

dx<-deriv3(y~sin(ax),"x",func=TRUE)		#生成二阶导数公式
dx(pi/6)

##计算y=ax^4+bx^3+x^2+x+c,其中a,b,c为常数
dx<-deriv3(y~a*x^4+b*x^3+x^2+x+c,"x",func=function(x,a=1,b=2,c=3){})
dx<-deriv3(y~x^4+2*x^3+x^2+x+3,"x",func=TRUE)	#两者等价
dx(2)

十三、偏导数计算

R语言中的数学运算-最全总结+解惑_第5张图片

 

fxy<-expression(2*x^2+y+3*x*y^2)	#构造二元函数公式,expression类型
dxy<-deriv(fxy,c("x","y"),func=TRUE)
dxy(1,1)

 

你可能感兴趣的:(数学理论,R)