par(family="Sarasa Gothic CL")#这个命令运行后就可以使用中文字体了
a<-3+7
b<-8
data("iris")
as.data.frame()
#加注释
control+enter #运行当前行
setwd('//Users//wangxinran//Desktop//R语言')#将括号内更改为默认目录,
#所有文件将默认储存到这个文件夹,点上栏文件夹符号即可查看该文件夹,注意
#要把单/改为双//
getwd()#查看当前目录是什么
install.packages('e1071')#安装一个包e1071
library('e1071')#打开安装包
x<-c(1,2,3,4,5)#写向量
y<-x^2
plot(x,y)#画图
?plot#查帮助,问电脑plot是做什么的
plot(cars)
plot(x,y,type='l',col='red')#让图是一条红色的线
x=c(1,2,3,4,5)
y=c(6,7,8,9,0)
mean(x)#求x的平均值
x<-c(1,2,3,4,5,2,4,3)
y<-c(x^2)
plot(x,y)
q<-c(x,x,7,8,5)#q里面装了x
mean(q)
q[5]#取q里的第五项,注意不安shift,是方括号,换成英文
q[3:5]#取第三项到第五项
A<-9
a<-8
#R语言的变量或者文件命名区分字母大小写,所有的字母和数字都可以用,
#后面还可以跟.或者下划线_,用.或者字母开头,但是若用.开头,
#后面紧接着的一位不能是数字,命名长度不限
wxr.x1999_R <- c(1,3,5,8)#注意c不可以大写
#写完一个代码或命令要用;隔开或者换行
#{}在执行循环体或函数语序体时会用
objects()#查看当前使用过的变量
rm(a,b)#删除某几个变量a,b
dev.new()#新开一个窗口,我们再执行画图,图像就在新窗口显示
assign("m",c(1,2,3))#把向量赋给m,也是写向量的一种方式
length(m)#向量m的长度
#向量运算,两个向量必须长度相当
n<-m+g
n<-m*g
n<-m/g
n<-m^g
sqrt(m)#对m开平方
exp(m)#e的m次方
log(m)#还可以取sin,cos
log(9,3)#log(x,base),后面是底,前面是真数
#复制rstudio中的图像到word,点击右栏polts,export,copy to clipboard,
#再黏贴到word
#control+l清空
#control+s 储存(笔记)
#control+加减号,可调整页面字体大小
data()#可显示R自带的数据库
data(CO2)#可调出数据库中的co2来看,在右栏中单击即可显示表格
#当上一行出现错误时,按键盘上箭头复制上一行,修改
#注意数字跟字母相乘时,也一定要有*号y=-1*x
#赋值符号前后有点空格,方便观看
#注意大小写,向量别忘了c
data.frame#数据框
data("iris")
iris<-iris
max(iris$Sepal.Length)#查看表中某一列或行的最大值
range(iris$Sepal.Width)#查看表中某一行或列的范围
prod(x,y) # 求乘积
var(x)# 求方差
x <- 1:30
x <- 2*1:15#产生向量1~15,且每一项都乘2
x <- seq(from=3,by=0.5,length=5)#seq 产生规则序列,by是公差
x <- seq(-10,10,by=0.1)#另一种写法,0.1的0可以省略
y=sin(x)
plot(x,y)
seq(2:8)#表示数列从1开始到8-2+1,即1 2 3 4 5 6 7
m <- 30
n <- (m-1):60
x <- c(-3,4,6.5,7,0)
y <- rep(x,times=5)#把x整体重复5遍
y <- rep(x,each=5)#把x每个数挨着重复5遍
x <- 4
y <- 5
if(x==4) z=5+6#双==表示判断谁等不等于谁,若if条件不满足,则找不到z的值
if(x<8) h=10-x
if(x<8&y>1)t=x+2*y#&“与”,表示前后两个条件同时成立
if(!(x<5))z=1#!"非“,表示否定后面的条件,x>=5,但输入的x=4,
#所以无法输出z
s <- 4
temp <- s<3#temp表示判断后面命题是否为真,再输入temp回车,系统会告诉你
#True,Flase
x <-5
temp <- x>3
if(temp)z=x+6#即如果temp出来是True,就能运算出z,F就算不出来
q <- 5
temp <- q>8
if(temp)p=11
x <-5
y <-6
if(x==6|y>3)z=11#|“或”,表示即前面或者后面只要有一个成立即可
setwd('//Users//wangxinran//Desktop//R语言')#先用setwd把目录换成默认
teens <- read.csv("snsdata.csv")#导入目录文件,把文件数据命名为teens
str(teens)#紧凑的表示对象的内部结构,即显示teens的内容
table(teens$gender)#统计表格中gender列每一种元素的个数
teens <- read.csv(file="snsdata.csv",header=T)
#header=T有表头(即第一行的变量名),header=F没表头,file是格式,没啥用
is.na(teens$age)#看age这个变量哪一列数据缺失
#$表示引用数据中的某一列
z <- c(1:3,NA)
is.na(z)#看z哪里缺失数据,缺失的地方是True,不缺失Flase
#缺失有两种,第一是数据直接是缺失的,第二种是数据包在运算过程中缺失,
#NaN 表示not a number,eg:0/0;Inf—Inf,当数据中出现这两个时,
#用is.nan()或is.na()都能判断数据在运算过程中是缺失的,
#但is.nan()只能判断运算过程中的缺失
#而is.na()两种缺失都能判断
x <- c(3,4,5,Inf-Inf,0/0)
is.na(x)
is.nan(x)
q <- c("x","y","z")#向量q可以是一个字符或字符串
q <- c('I want to eat','no')
labs <- paste(c("X","Y"),1:10)#将XY与数字1到10拟合(连接),赋值给lab
labs <- paste(c("X","Y"),1:10,sep='+')#sep表示拟合符号用加号+拟合
labs <- paste(c("X","Y","Z"),1:10,sep='&')#没有sep表示默认用空格
#作为中间的拟合符号
paste(1:12,c("st","nd","rd",rep("th",9)))#rep 重复9次
x <-c("hello","world","!")
nchar(x)#判断字符向量中,每一个元素字符串中字母的个数
DNA <- "AtGCtttACC"
tolower(DNA)#把所有的字母换成小写
toupper(DNA)#把所有的字母换成大写
chartr("Tt","Uu", DNA)#改变字母,把T变成U,t变成u
chartr("TtA", "Uua", DNA) # T换成U, t换成u, A换成a
X<-c("He say:\'hello', and then go")
X<-c("He say:'hello', and then go")
substr("abcdef",start=2,stop=4)#截取字符串string中的一部分sub,从第二个到第四个
#index vector 向量的索引,即在向量里取一部分,形式:向量[ ]
x<-c(-3:10,NA,NA)
x[is.na(x)] <- 0#把x里的NA改成0
y <- x[!is.na(x)]#x不是NA的地方赋给y
(x+1)[(!is.na(x)) & x>0] -> z#把x里不是NA并且大于0的数取出来,加1,最后赋给z
x[(!is.na(x)) & x>0]+1 -> z#与上面一样的
x[1:3]#看x第一到三个元素,[ ]里填想索引的子集
x<-c(-3:10,NA,NA,3:5,NA,1)
x[is.na(x)] <- 3
y<-c(-4:5)
y[y < 0] <- -y[y < 0]
y <- abs(y)#把y的每一项都变成正的
teens <- read.csv("snsdata.csv")
teens$gender <- ifelse(is.na(teens$gender),'I see',teens$gender)
#把teens里gender这一列里缺失的地方都换成I see,其余不变
#ifelse,如果(缺失,换成I see)否则(不变)
c("x","y")[rep(c(1,2,2,1), times=4)]#把字符“x","y"按1221的顺序重复思辨
x<-c(-3:10)
y <- x[-(1:5)]#除去x里的第1到5项
fruit<- c(5, 10, 1, 20)
names(fruit) <- c("orange", "banana", "apple", "peach")
fruit
lunch<- fruit[c("apple","orange")]#索引里面的apple,orange那两列
#想把上面的fruit表格存下来,首先把你想存的地址先换成当前目录setwd()
#fruit表格有两种储存形式
write.table(fruit, file = "fruit.txt", row.names = F, quote = F)#txt形式
write.table(fruit, file = "fruit.txt")#有表头
install.packages('ggplot2')#作图包
library('ggplot2')#只需要安装一次,以后只要library用就行
pie(iris$Sepal.Length)#画饼状图
plot(iris$Sepal.Length)#散点图
gupiao <- read.csv('ss_stock.csv')
plot(gupiao)
plot(gupiao$Open,type='l')
#factor型变量,分类别或者分层次的,比如iris里的species
levels(iris$Species)#看species的每一层是什么
str(iris)#species分3类"setosa","versicolor",..我们可以分类画图
plot(iris$Sepal.Length,iris$Species)
library(MASS)#用require也可以加载一个包
a1 <- Cars93
plot(a1$Origin)
dev.new()
plot(a1$Origin,a1$Price)#箱线图,中间的黑线是中位数,可查资料看
plot(~iris$Sepal.Length+iris$Petal.Length)#画二者的关系图,注意~别忘了
#~表示取一部分数据,看两两之间有什么关系
plot(iris$Sepal.Length~iris$Sepal.Width+iris$Petal.Length)#~前是因变量纵坐标
#~后面是自变量,这一个命令画了两个图(sepallength分别跟width跟length的图),
#点箭头可以查看前面的图
#recursive递归结构,list里面再装一个list
x <- c(3:10,NA,NA)
mode(x) #看一个对象的属性
#object对象,可以是向量,也可以是list列,向量只能是简单形式eg:numeric、character
#多个模式不能交杂在一个vector里,但list里可以有多种形式
y <- as.character(x)#as.character,改变类型,把x从数字型转化成字符型as.numeric( )
#as.logical( )as.charactor( )as.matrix( )as.dataframe( )as.list( )
a <- numeric()#写一个空向量a
a[3] <- 7#填充a的第三个位置为7
length(a) <- 3 #a的长度就变为3了,用这种办法可以改变向量的长度
a[4:8] <- c(6,7,10,-2) #再把a的4~8位用向量c填充
length(a) <- 5# 截取,使a的长度变为5,只保留前五个元素
a <- a[-6:-8]#去掉a里的第六到底八个元素
x <- cbind(a=1:3,pi=pi)#列合并
x <- rbind(a=1:3,b=7:9)#按行合并
options(digits = 3)#改变小数的有效位数
attributes(x)#显示x的维度
#dim(x)看x行、列的维度,并写成一个向量
#结果出现“dim 3 2”:表示有三行两列
#dimnames[1]:看行的名字
#dimnames[2]:看列的名字
#dim(M)[1]:看数据框M行的维度(有几行)
#dim(M)[2]:看数据框M列的维度(有几列)
x <- 1:24
attr(x,'dim') <- c(3,8)#把x的维度变为三行八列
row.names(x) <- c('row1','row2','row3')#改变行的名字
colnames(x) <- c('col1','col2','col3','col4','col5','col6','col7','col8')
colnames(x) <- paste(c("col"),1:8,sep = "")#这样就不用一个一个输入col了
attr(x,"dimnames")<-list(paste("row",1:3,sep = ""))#另一种改变行名字的办法
class(x)#class看object的类型eg matrix,数组等,比mode范围更大
typeof#看是整形,范围最小最细致
as.integer(digits)#把小数变成整形
gl(2,5)#2代表两个水平,5代表每一个水平有5个,gl产生一个factor型,即因子型变量
#因子型,比如iris里的species就是因子型,有三层
a <- gl(2,5,label=c("Male","Female"))
state <- c("tas","sa","qld")
class(state)
statef <- factor(state)#把state换成因子变量
statef <- as.factor(state)#同上
class(statef)
is.factor(statef)
scores <- scan()#scan()在键盘上输入数据赋给scores,再看scores就有你输入的数据
#> scores <- scan()
#1: 68 89 98 100 67 28#输入你的数据
#7: #回车
# Read 6 items #系统自动出现
#> scores #查看scores
#[1] 68 89 98 100 67 28
cut(scores,breaks=c(0,70,80,90,100))#把数据按0~70,70~80····来分段,
#就可以看到每一个数据在哪一层,还可以给每一层用字符命名labels=
scoresF <-cut(scores,breaks=c(0,70,80,90,100),labels=c("差","中","良","优"))
table(scoresF)#统计每一层分别有多少个
class(scoresF)#scoresF是因子型
sexs <- sample(c('M','F'),length(scores),replace = T)#随机抽样,构造性别向量
#随机产生一些性别,按照scores的长度,自动给每个数据配上性别
#replace=T“有放回的随机抽样?Ture”
table(sexs,scoresF)#统计男女同学在不同层次的人数,做一个table,sex为行scoresF为列
tapply(scores,sexs,mean)#计算男女同学的平均成绩“成绩要按照性别求平均”
tapply(scores,sexs,sd)#计算男女同学成绩的标准差“成绩要按照性别求标准差”
#因子型变量不能直接比较大小,因为默认是无序,需要先变成有序型的因子变量ordered=T
scoresF1 <- factor(scoresF,ordered = T)
scoresF1[1] #矩阵就是一个二维的数组 x <- 1:24 dim(x) <- c(3,8)#产生矩阵的方法(1)只能按列产生,先产生第一列。。。 attr(x,'dim') <- c(3,8)#产生矩阵的方法(2) #产生数组方法如下: dim(x) <- c(2,6,2)#两行六列的矩阵两个(必须相乘等于元素个数) x <- 1:36 dim(x) <- c(2,2,3,3)#四维数组,3*3个2*2维的矩阵 #数组:2*2的矩阵,3个为一组,有3组 #先产生一个3*3的大矩阵,每一个元素都是一个2*2的矩阵 dim(x) <- c(4,9) x[c(1,3,4),c(1,3,5,7,9)]#取第1,3,4row与第1,3,5,7,9column交叉项 x[1:3,2:8]#矩阵索引的另一种,取1~3行,2~8列 x[,2:8]#","表示都要,行都要,列取2~8 x[5]#x[n]可以按矩阵生成的顺序一个一个地索引,先索引完第一列,再开始第二列 x <- 1:36 dim(x) <- c(2,2,3,3) x[1,1,1,1]#数组索引 x[,,2,3]#","表示全要 x[3]#数组也可以按数组产生的顺序一个一个索引,顺序索引 a <- 1:4 b <- 2:5 cbind(a,b)#按列产生矩阵 rbind(a,b)#按行产生矩阵 x <- 1:36 matrix(x,nrow = 9,byrow=T)#按行产生矩阵,9行 matrix(x,nrow = 4,byrow=F)#按列产生矩阵,4行 x <- 1:36 array(x,c(4,9)) #产生矩阵的方法有? #dim, attr,cbind,rbind,matrix,array y <- 25:48 y.matrix <- matrix(y,nrow=4,byrow=F) x <- 1:24 dim(x) <- c(4,6) x+y.matrix x*y.matrix#对应位置元素相乘,要求两个矩阵的行数列数都相同 L <- 1:24 H <- 25:48 L%*%H #两个向量内积:对应元素相乘相加,是一个数 L%o%H #两个向量外积:Anx1 x A1xn=Anxn,是一个向量,自动把前面那个变成一列的向量 outer(L,H,'*')#计算外积的另一种方式,*可以改成任意一种运算符号,甚至是一个函数 f <- function(x,y){cos(x)/sin(y)} outer(L,H,'f')#L,H按照f做外积运算 #L里第一个元素,与H里第一个元素当成xy去做f运算,作为新矩阵的第一个元素 f <- function(x,y){min(x,y)} outer(L,H,'f') y <- 25:48 y.matrix <- matrix(y,nrow=4,byrow=F) x <- 1:24 dim(x) <- c(6,4) x%*%y.matrix#线代里的矩阵乘法 dim(y.matrix) y.matrix <- t(y.matrix)#t()做矩阵转至 dim(y.matrix) a <- 1:24 x <- array(a,c(2,3,4)) aperm(x)#数组转至 c(4,3,2)变成两个矩阵,以前的所有矩阵的第一行组成第一个矩阵 #以前所有矩阵的第二行挑出来组成第二个新的矩阵 A <- matrix(1:36,nrow = 6) diag(A)#取对角线元素 sum(diag(A))#diagA所有元素相加 diag(3)#生成3x3阶单位矩阵 mean(A)#求A所有元素的均值 iris <- iris mean(iris$Sepal.Length)#求Sepal.Length这一列的均值 colMeans(iris[,1:4])#同时求一到四列各自的均值 colMeans(iris[3:8,1:4])#同时对1~4列的3~8行求各自的均值 apply(iris[,1:4],1,mean)#对iris的所有行求均值,若中间换成2就是求列平均 #apply既可以对列求均值,也可以对行求均值 A <- 1:36 A <- matrix(A,nrow = 6,byrow = T) B <- 37:72 B <- array(B,dim = c(6,6)) A*B#A B 对应元素相乘 A%*%B#A B做高代里的矩阵乘法 diag(A)#取出对角线元素 trace_A <- sum(diag(A))#trace_A一般用来命名矩阵的ji,就是对角线元素的和 diag(3)#生成3x3单位矩阵 mean(A)#所有元素求均值 colMeans(A)#每一列求均值 rowMeans(A)#每一行求均值 apply(A,2,mean)#每一列求均值,注意mean函数可以换,比如sum apply(A,1,mean)#每一行求均值 #线性方程组A%*%x=b #求解线性方程组solve(A,b) x <- c(1,-2,3,-4,0,1,-1,1,1,3,0,1,0,-7,3,1) A <- matrix(x,nrow=4,byrow = T) b <- c(4,-3,1,-3) x <- solve(A,b)#以行的形式展示结果 x <- solve(A)%*%b#以列的形式展示结果 #注意,只能求解方阵 #8e-16 8乘10的负16次方 A%*%x#可用于验证结果是否正确,若=b则正确 a <- c(1,-2,3,-4) b <- c(0,1,-1,1) c <- c(1,3,0,1) d <- c(0,-7,3,1) A <- rbind(a,b,c,d)#按行产生矩阵 b <- c(1,2,3,4)#注意不要写成列向量 aperm(b)#求数组b的转至 t(as.matrix(b))#把b改成矩阵,求矩阵转至 B[-4,]#去掉矩阵B中的某行或某列 #只有方阵才能求行列式,特征值,特征向量 B <- 37:72 B <- array(B,dim = c(6,6)) ev <- eigen(B)#求B的特征值特征向量 ev$values#只看eigen value ev$vectors#只看eigen vector typeof(ev) ev[[1]]#只看list里第一项 ev[[2]]#只看list里第二项 #自己编个程序,求矩阵的正交变换 tapply(iris$Sepal.Length,iris$Species,mean) tapply(a,b,mean)#按b求a的均值 A <- 1:36 A <- matrix(A,nrow = 6,byrow = T) apply(A,1,sum)#对矩阵A按行求和 a <- sapply(1:3,function(x)x^2)#对A第1:3个元素按function变换,求出来a是个向量 #可以直接求和 求均值 sum(a)mean(a) b <- lapply(1:3,function(x)x^2)#对A第1:3个元素按function变换,求出来是个list, #list是一个杂框,想装什么都行 sapply(iris[,1:3],function(x)cos(x)/(sin(x)+exp(x))) sapply(iris[,1:3],mean) iris1 <- iris[1:4,1:4] sapply(iris1,mean)#每一列求均值 b1 <- lapply(iris[,1:3],mean) b1[[1]]#看b1的第一个位置 class(b1) b2 <- unlist(b1)#把list解开,就可以求和求均值了 c <- mapply(mean,iris[,1:3])#先喂函数,再喂数据 sum(mapply(function(x)x^2,iris[,1]))#mapply出来的类型不一定 mapply(rep,times=1:4,x=4:1)#4重复1遍,3重复2遍。。。 Lst <- list(name="Wxr",husband="Ldm",lunch="中餐",food=c("beef","tomato")) #构造一个list Lst$name#查看其中一项 x <- c(1,3,4) y <- matrix(1:24,nrow = 3,byrow=T) z <- list(x,y,c("a","b"))#把xyc合成一个list z[[1]]#查看list第一项 x <- c(1,3,4) y <- matrix(1:24,nrow = 3,byrow=T) z <- c("a","b","c","d") L <- list(L1=x,L2=y,L3=z) L$L1#查看第一项 Lst_iris <- list()#先定义一个空的list或者空的vector Vector_iris <- c() for(i in 1:50){ Lst_iris[[i]] <- apply(iris[i,1:4],1,mean) Vector_iris[i] <- sd(iris[i,1:4]) }#对空变量的每一项参与for循环 Lst_iris Vector_iris Lst_iris[[1]] c(Lst_iris,Vector_iris)#将两个list合并 data.frame#数据框 eg iris,比list方正,里面的向量必须长度一致,矩阵有相同行数 #数据框是一种矩阵形式的数据,数据框中的各列可以是不同类型的数据,每列是一个变量 #,每行是一个观测 ID <- c(1,2,3,4) name <- c("A","B","C","D") score <- c(60,70,80,90) student1 <- data.frame(ID,name)#构造两个小数据框 student2 <- data.frame(ID,score) total_student1 <- merge(student1,student2,by="ID") #因为student1,2有相同的ID,就可以用merge按照ID合成一个大的数据框 ID <- c(1,2,3,4) name <- c("A","B","C","D") score <- c(60,70,80,90) sex <- c("M","F","M","M") student1 <- data.frame(ID,name) student2 <- data.frame(score,sex) total_student2 <- cbind(student1,student2) #因为student1,2没有相同的变量,可以用cbind进行列合并成一个大的数据框 ID <- c(1,2,3,4) name <- c("A","B","C","D") student1 <- data.frame(ID,name) ID <- c(5,6,7,8) name <- c("E","F","G","H") student2 <- data.frame(ID,name) total_student3 <- rbind(student1,student2) #因为student1,2没有相同的变量,可以用rbind进行列合并成一个大的数据框 total_student3 attach(iris)#把数据框引到界面里,有了此命令就可以直接用Sepal.Length #可以attach多个数据在界面里 Sepal.Length detach(iris)#把数据框从界面拿掉,后面就不能直接用Sepal.Length查找 Sepal.Length mydataframe <- data.frame( name=c("张三", "李四", "王五", "赵六", "丁一"), sex=c("F","F","M","M", "M"), age=c(16, 17, 18, 16, 19), height=c(167.5, 156.3, 177.3, 167.5, 170.0), weight=c(55.0, 60.0, 63.0, 53.0, 69.5) ) #可以在括号里写内容,直接列合并生成数据框 mydataframe[2:4,]#可以像矩阵一样索引 mydataframe[["name"]]#数据框独特的索引方式 mydataframe$name# $列索引 colnames(mydataframe) <- c("names","sexs","age","height","weight")#改列名字 row.names(mydataframe) <- c("第一行","第二行","第三行","第四行","第五行") mydataframe1 <- t(mydataframe)#转至后就不是数据框了 mydataframe2 <- as.data.frame(mydataframe1)#强制转化成数据框 mydataframe2$第一行 mydataframe$H_W_ratio <- mydataframe$height/mydataframe$weight #添加一列H_W_ratio,内容是身高与体重的比值 mydataframe$BIM <- mydataframe$weight/mydataframe$height^2 edit(mydataframe)#弹出一个表格,数据编辑器,可以直接在里面改(mac不行) #但改完只能显示在屏幕里,不能保存在data.frame里 mydataframe <- edit(mydataframe)#给他赋值以后才能保存下来,赋值成新的mydataframe fix(mydataframe)#跟edit一样,但是可以直接存到data.frame里 subset(mydataframe,name=="王五")#只调王五的信息出来 subset(mydataframe,name=="王五"|name=="赵六")#调王五跟赵六的信息 subset(iris,Species=="setosa")#注意是双等号,就是判断,是setosa的就调出来 library("MASS")#读一个以前下载的包 Cars93 <- Cars93#看cars93调出来 USA_pro <- subset(Cars93,Cars93$Origin=="USA")#单条件选取 USA_pro <- subset(Cars93,Cars93$Origin=="USA",select=c(Type,Price)) #挑选出满足条件的type跟price,只看他俩 pro <- subset(Cars93,select=c(Type,Price))#只看所有的type跟price USA_pro_mode_Astro <- subset(Cars93,Cars93$Origin=="USA"&Cars93$Model=="Astro") #多条件选取 pie(a,b) a <- c(40,50,60,70) b <- c("a","b","c","d") pie(a,b) pie(a,b,col = rainbow(4)) levels(Cars93$Manufacturer)#看manufacturer有几种,后面好挑选画图 #挑选"Acura" "Audi" "BMW" "Buick" M <- subset(Cars93,Manufacturer=="Acura") dim(M)#取M的维度,是个向量 dim(M)[1]#可以只看Acura行的维度,就知道种类是Acura的有几个了 length(which(Cars93$Type=="Compact"))#用这个也可以知道类型是Compact的有几个 a <- c(dim(subset(Cars93,Manufacturer=="Acura"))[1], dim(subset(Cars93,Manufacturer=="Acudi"))[1], dim(subset(Cars93,Manufacturer=="BMW"))[1], dim(subset(Cars93,Manufacturer=="Buick"))[1]) #取"Acura","Audi","BMW","Buick"行的维度数来画图 table(Cars93$type)#也可以直接用table来代替上面的步骤,直接统计出每种类型的数量 b <- c("Acura","Audi","BMW","Buick")#给每一部分起名字 pie(a,b,col=c("skyblue","ligthgreen","red","yellow")) pairs(iris)#跟plot(iris)一样#当两个数据相关性很大时,可以去掉一个只留一个 #scatterplot散点图 dev.new() coplot(Cars93$Fuel.tank.capacity~Cars93$Price|Cars93$Origin) #在origin的条件下,看油箱存油量跟价格的关系 #coplot(因变量,自变量|因子变量)按照因子变量来画因变量自变量的联合散点图 coplot(Cars93$Fuel.tank.capacity~Cars93$Price|Cars93$Origin+Cars93$DriveTrain) #看油箱存油量跟价格在不同产地下的关系,油箱存油量跟价格在不同驱动下的关系 hist(iris$Sepal.Length)#画频数分布直方图 hist(iris$Sepal.Length,nclass=4)#nclass规定分成几组,就把前面那个图的条合并一下 #但有的时候nclass不一定管用,因为他是平均分配,把上面那个nclass改成5就不行 hist(iris$Sepal.Length,breaks=c(4.3,4.5,5.5,6.5,7.5,7.9))#自定义分界点、组数 hist(iris$Sepal.Lengt,probability = T)#纵坐标变成频数的占比 hist(iris$Sepal.Length,probability = F)#纵坐标是频数 hist(iris$Sepal.Length,probability = T,main = "Length")#main给图起个标题,可中文 par(mfrow = c(1,2))#把画图窗口分成一行两列的块(左右两块) data <- c(rep(1,10), rep(2,5), rep(3,6)) data #rep(2,5)产生5个2 hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), probability = T, main = "A") hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), probability = F, main = "B") par(mfrow = c(1, 2)) data <- c(rep(1, 10), rep(2, 5), rep(3, 6)) hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), axes = T, main = "axes = T") hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), axes = F, main = "axes = F") #axes=F就是不要坐标轴 par(mfrow = c(1, 2)) data <- c(rep(1, 10), rep(2, 5), rep(3, 6)) hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), col = "pink")#给颜色 hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), col = rainbow(3)) hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), col = rainbow(3),border=NA) #去掉每一个框线 par(mfrow = c(1, 3)) data <- c(rep(1, 10), rep(2, 5), rep(3, 6)) hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density = 1, main = "density = 1") hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density = 2, main = "density = 2") hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density = 20, main = "density = 3") #给条添点线,密度大就是添的线多,没具体值 par(mfrow = c(1, 3)) data <- c(rep(1, 10), rep(2, 5), rep(3, 6)) hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density=2,angle=45) hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density=2,angle=90) hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density=8,angle=30)#添的线的角度30度 hist(data, breaks = c(0.5, 1.5, 2.5, 3.5), density = 5,angle = 60,col = "pink") barplot(GNP ~ Year, data = longley)#画柱状图 barplot(cbind(Employed, Unemployed) ~ Year, data = longley)#做堆叠条形图,即因变量可以多个 data("longley")#longley是软件自带的数据,跟iris一样 barplot(cbind(Employed, Unemployed,Population) ~ Year, data = longley) barplot(cbind(Employed, Unemployed) ~ Year, data = longley,col=rainbow(2)) boxplot(iris$Sepal.Length~iris$Species)#把因子变量放后面,箱线图,超出横线是异常数据 boxplot(len ~ dose:supp, data = ToothGrowth, boxwex = 0.5, col = c("orange", "yellow"), main = "Guinea Pigs' Tooth Growth", xlab = "Vitamin C dose mg", ylab = "tooth length", sep = ":", lex.order = TRUE, ylim = c(0, 35), yaxs = "i") ToothGrowth <- ToothGrowth #len因变量(纵坐标),dose跟supp两个因子变量两两搭配做自变量 which(iris$Sepal.Length<5&iris$Species=='virginica')#查找满足条件的数据,会显示他所在的行 #用这个办法可以看箱线图的异常数据 #boxwex箱子的宽度 main给图起名字 xlab横坐标的名字 ylab纵坐标的名字 #sep 两个因子变量之间的连接符号 ylim纵坐标的范围 lex.order自变量的排列顺序 # yaxs='i'表示刻度线都在数据范围内部,紧贴着ylim的上下限 boxplot(len ~ dose:supp, data = ToothGrowth, boxwex = 0.8, col = c("orange", "yellow","green"), main = "boxplot", xlab = "x axes", ylab = "y axes", sep = "+", lex.order = FALSE, ylim = c(0, 50),yaxs = "r") dotchart(cars$speed)#可以看到同样的值有几个 dotchart(cars$speed,xlim=c(10,20))#xlim规定横坐标的范围 length(which(Cars93$Type=="Compact")) x <- seq(-10,10,0.1) y <- x z <- outer(x,y,function(a,b)a^2+b^2)#外积 class(z) image(x,y,z)#画一个热力图,没有数据 contour(x,y,z)#画一个等高线图,因为z是x、y的平方和是个圆圈 z <- outer(x,y,function(a,b)a^2-b^2) image(x,y,z) contour(x,y,z)#画出来是个马鞍面的 persp(x,y,z)#画一个三维立体图,也是个马鞍面 #contour图是persp同一圈的高度向底面映射实现的(即xoy面的投影) dev.new() persp(x,y,z,col= heat.colors(30),theta = 45,phi=15,r=sqrt(3),d=1,axes = FALSE) #theta 设置视角的方位角方向,phi为设置视角的余维度. r 观察点到图中心的距离. #d 数值,用于增强或减弱透视效果. scale 设置在画图时是否要保持高度比例. #expand 用于扩大或缩小z坐标.col 曲面表面的颜色. border 曲面边框的颜色. #ltheta, lphi 如果设置了这个值,曲面的光源就是根据ltheta和lphi设置的角度来绘制. #shade 计算曲面阴影的参数. axes 表示是否要画坐标轴. #ticktype设置标记的类型. require(grDevices) # the same to library(grDevices) x <- seq(-10, 10, length= 30) y <- x f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r } z <- outer(x, y, f) z[is.na(z)] <- 1 op <- par(bg = "pink")#bg添加背景颜色 persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = rainbow(1000)) persp(x, y, z, theta = 45, phi = 20, expand = 0.5, col = rainbow(1000), r=180, ltheta = 120, shade = 0.75, ticktype = "detailed", xlab = "X", ylab = "Y", zlab = "Sinc( r )" , border=30, axes = F) x <- seq(-pi, pi, len=50) y <- x f <- outer(x, y, function(x, y) cos(y)/(1 + x^2)) contour(x,y,f) persp(x,y,f,col=heat.colors(30)) contour(x,y,f) contour(x,y,f,nlevels=3,col='red',add=TRUE)#nleves=3增加3条等高线 #add=TRUE 在上面画的那个图上增加一些细节,而不是画新的,一般用于两个高级做图之间 image(x,y,f) contour(x,y,f,add=TRUE) plot(1:5, 1:5, type = "n", xlim = c(0, 6), ylim = c(-1, 8))#先画了一个空框 symbols(x = 1:5, y = 1:5, circles = rep(1, 5), inches = FALSE, add = TRUE) #add=T,就是把add前面的命令添加在上一个画的图里,上面两个命令相当于下面这一个 symbols(x = 1:5, y = 1:5, circles = rep(1, 5),inches = FALSE, xlim = c(0, 6), ylim = c(-1, 8)) inches=T #英寸,画的圆大一点, #x = 1:5, y = 1:5 目的是给圆配圆心(1,1)(2,2)...circles = rep(1, 5)画半径是1的圆五个 plot(1:5, 1:5, type = "n")#若没有type=‘n’,就会画成散点图,type=‘n’就是啥也不画 plot(1:5, 1:5)#x=1,2,3,4,5 y=1,2,3,4,5 搭配成坐标(1,1),(2,2)...画成散点图 contour(x,y,f,axes = F)#不要坐标轴 contour(x,y,f,axes = T)#要坐标轴 plot(1:100) plot(1:100,log="x")#设置x轴成为对数轴 #相当于下面 x <- 1:100 y <- log(x) plot(1:100,log="y")#设置y轴成为对数轴 plot(1:100,log="xy") x <- seq(-10,10,0.5) y=sin(x) plot(x,y,type='p')#散点图 plot(x,y,type='l')#折线图 plot(x,y,type='b')#不穿过点的曲线图 plot(x,y,type='o')#穿过点的曲线图 plot(x,y,type='h')#连垂直线 plot(x,y,type='s')#连成阶梯形,一个点连另一个点的时候先横向走 plot(x,y,type='S')#连成阶梯形,一个点连另一个点的时候先竖向走 plot(x,y,type='o',col='red',font.main = 3,main="y=sinx",xlab="aaa",ylab="bbb",font.lab=2) #font.main改标题的字体 font.lab改变坐标轴名称的字体 font.axis改变坐标轴的字体 #1:normal 2:斜体italic 3:粗体bold 4:粗斜体 bold italic plot(x,y,type='o',col='red',font.axis=2) plot(x,y,type='o',col='red',font.main = 3,main="y=sinx",sub="sin function") #sub=''添加副标题 x <- 1:30 y <- sin(x) plot(x,y)#先画一个散点图 lines(x,y,col="red") points(x,y,type = 's') #lines,points都是低级做图命令,它是在高级做图命令下(eg:plot),往原来的图里添加一些别的信息 text(20,0.5,"lalala",col='blue')#在x=24,y=0.5的位置写一点文字 mtext('I want to China',col='green',side=4) #在图形边框外写文字,side=1下面,side=2左面,side=3上面,side=4右面 setwd('//Users//wangxinran//Desktop//R语言') HW <- read.table('HW.txt',header = T) plot(HW) x <- HW[,1] y <- HW[,2] plot(x,y) lm.out <- lm(HW$Height~HW$Weight)#lm:找二者之间回归直线y=ax+b中的参数 lm.out#intercept对应b(截距),0.2719是a abline(152.1136,0.2719,col='red' )#把回归直线直接画到上面的散点图里,注意别喂错数据位置 abline(lm.out$coefficients,col='blue')#第二种画法,直接取系数,就不会写错数了 abline(lm.out,col='green')#第三种画法 #做回归:跟数据,我们估计他们的关系是线性关系,用lm找到线性回归的系数,再用abline画出直线 #用poygon进行纯色填充 xx<-c(1:100,100:1) yy<-rev(cumsum(xx))#cumsum是累计求和,rev是颠倒数字顺序 x <- c(1,2,3,4) y1 <- cumsum(x) y2 <- rev(y1) plot(xx,yy,type='l') plot(xx,yy,type='n',xlab="Time",ylab="Distence")#先画一个空白框,再用polygon给封闭位置填充 polygon(xx,yy,col="gray",border="red")#border边界颜色,col给封闭图形填充颜色 title("I am happy to do this")#给上面的图加标题 plot(c(1, 9), 1:2, type = "n") polygon(1:9, c(2,1,2,1,NA,2,1,2,1), density = c(10, 20), angle = c(-45, 45))#填充线 #NA就是4~6中间的空白,就画成了两个封闭图形 #legend给图例 x <- seq(-pi, pi, len=65) #from –pi to pi, produce 65 data plot(x, sin(x), type= "l",ylim = c(-1.2, 1.8), col=3,lty =2)#lty线型,lty=2是虚线 #col取3就代表绿色,若他换成green,legend里也要换成green,必须一一对应 points(x,cos(x),pch=3,col=4)#pch表示数据点位置用加号标出,不同的数值代表不同的加号 lines(x,tan(x),type="b",lty=1,pch=4,col=6)#type=b表示交替出现 title("legend(..., lty = c(2, -1, 1), pch = c(NA, 3, 4), merge = TRUE)", cex.main = 1.1)#cex.main标题字体大小 legend(-1,1.9,c("sin","cos","tan"),col=c(3,4,6),text.col= "green4", lty= c(2,-1,1),pch=c(NA,3,4), merge =TRUE, bg="gray90") #-1,1.9 表示图例放的位置,text.col是图例里面字体的颜色,bg是图例背景颜色,merge=T居中对齐 #注意就是每一项的信息跟上面的函数信息一一对应,没有的位置就用NA #不同数字代表不同类型eg不同颜色,不同线型 y <- function(x)log(x)+sqrt(x)+x^(1/3) plot(y,1,1000,main=expression(y=log(x)+sqrt(x)+sqrt(x,3)),lwd=3,col="blue") #用expression在标题中写数学表达式(1) text(600,20,expression(paste(bgroup("(",atop(n,x),")"), p^x, q^{n-x}))) #用expression在图里面600,20的位置标注数学表达式(2) #用paste把bgroup("(",atop(n,x),")"),p^x, q^{n-x}三个粘贴到一起 text(800,30,expression(paste(bgroup("{",atop(n,k),"}"), p^k, q^{n-k}))) title(expression(x%in%A))#体会不同数学表达式的写法x%in%A x属于A #也可以不用main,用title加标题,配合expression写数学表达式(3) par(family="Sarasa Gothic CL")#这个命令运行后就可以使用中文字体了 #交互式命令 locator,identify x = rnorm(10)#产生十个随机数 plot(x) locator(5,"o") text(locator(1), "Outlier", adj=0)#把文字写到你点的地方 #当你画了一个散点图,你想把其中几个点连成折线,就用locator命令,数字表示你想点几个点 #这样你点到的那些点他就会给你连起来,也可以不是你画出来散点图中的点,图里所有的位置都可以 require(graphics) hca<- hclust(dist(USArrests)) plot(hca) (x <- identify(hca))#identify分层聚类,点上面的分支竖线,他就会把你点的那一类分支包括起来 #当你执行了交互式命令时,运行窗口有一个红色的圈写着stop,当你点完想点的,就点stop结束交互 x<-1:100 y<-sin(x) plot(x,y,type = "l") identify(40,1,"标一下") #你需要在坐标位置[40,1]那里点击一下,添加文字,点到别处则会出错 #par命令 #一、关于颜色 opar<-par(no.readonly=TRUE) #have a try to write par(no.readonly=TRUE) #把默认的参数都存下来,存到opar里,最后再恢复它,以免画后面的图受到用par设置的参数的影响 x<-seq(1,10,length.out=100)-5#每个数据都要剪掉5 y<-c(log(x[x>0]),log(abs(x[x<=0]))) par(fg="red")#前景颜色 par(bg="yellow")#背景颜色 par(col='purple')#里面画的线的颜色 par(col.axis='green',col.lab="white")#坐标刻度值的颜色,坐标轴名字的颜色 plot(x,y, type="l") title(main="BlackbgAndRedfg",col.main="pink",sub="Byprogram-dog.blogspot.com", col.sub="blue") par(opar)# par恢复默认参数,这样你后面画的图还是默认的设置(如默认颜色等) #也可以不用opar,直接把昨天窗口扫空也行 par(fg="red",bg="yellow",col='purple',main="BlackbgAndRedfg",col.main="pink", sub="Byprogram-dog.blogspot.com",col.sub="blue")#可以把上面的都合并到par里 #注意要把par放在高级做图命令plot之前,才能显示出par里的条件信息 #二、关于字体 #1】font 可以分别设置部分字体 粗体斜体粗斜体 opar<-par(no.readonly=TRUE) x<-seq(-10,10,length.out=100) y<-sin(x) par(font.axis=1)# 1 normal par(font.lab=2)# 2 bold par(font.main=3)# 3 italic (type) par(font.sub=4)# 4 bold Italic plot(x,y,type='l') title(main="fontstyle",xlab = "粗体", sub="Byprogram-dog.blogspot.com") par(opar) #2】family 统一设置全部字体 宋体,黑体,楷体 serif", "sans" and "mono" dev.new() opar<-par(no.readonly=TRUE) par(mfrow=c(4,1)) x <- -10:10 y <- -(x^2) par(family="mono") #mono字体 plot(x,y,type='l') title(main="family mono style",sub="Byprogram-dog.blogspot.com") par(family="") #默认字体default plot(x,y,type='l') title(main="family default style",sub="Byprogram-dog.blogspot.com") par(family="serif") #serif字体 plot(x,y,type='l') title(main="family serif style",sub="Byprogram-dog.blogspot.com") par(family="sans") #sans字体 plot(x,y,type='l') title(main="family sans style",sub="Byprogram-dog.blogspot.com") par(opar)# Restoring the parameters of par #三、关于字号 #1】ps直接设置磅值(字号大小),只能设置全部字体 opar<-par(no.readonly=TRUE) x <- seq(-10,10,length.out=100) y <- log(x^2) dev.new( ) par(mfrow=c(3,1)) par(ps=10)#10 plot(x,y,type='l') title(main="fontsize: ps=10",sub="Byprogram-dog.blogspot.com") par(ps=15)#15 plot(x,y,type='l') title(main="fontsize: ps=15",sub="Byprogram-dog.blogspot.com") par(ps=20)#20 plot(x,y,type='l') title(main="fontsize:ps=20",sub="Byprogram-dog.blogspot.com") par(opar) #2】cex取normal情况下的倍数 par(cex.main=1.5),可以只改部分字体 opar<-par(no.readonly=TRUE) x<-seq(-10,10,length.out=100) y<-sin(log(x^2)) dev.new() par(mfrow=c(2,1)) par(cex.main=1) plot(x,y,type='l') title(main="fontsize:cex.main=1",sub="Byprogram-dog.blogspot.com") par(cex.main=1.5) plot(x,y,type='l') title(main="fontsize:cex.main=1.5",sub="Byprogram-dog.blogspot.com") par(opar) #cex也可以取ps的倍数 par(ps=20,cex.main=0.5) opar<-par(no.readonly=TRUE) x<-seq(-10,10,length.out=100) y<-sin(log(x^2)) dev.new() par(mfrow=c(2,1)) par(ps=20,cex.main=0.5) plot(x,y,type='l') title(main="fontsize:cex.main=1",sub="Byprogram-dog.blogspot.com") par(ps=20,cex.main=1.5) plot(x,y,type='l') title(main="fontsize:cex.main=1.5",sub="Byprogram-dog.blogspot.com") par(opar) #cex.axis for axis 坐标刻度值的字号 #cex.lab for labels坐标轴名字的字号 #cex.main for title主标题的字号 #cex.sub for sub-title副标题的字号 #四、关于线型 lty #Style of line,1: full line;实线2: dashed line;虚线3: dotted line; #点化线4: dot-dashed line;5: long dashed line opar<-par(no.readonly=TRUE) x<-seq(-10,10,length.out=100) y<-sin(log(x^2)) par(lty=1) plot(x,-y,type='l',col="red",ylim=c(-3,3)) par(lty=2) lines(x,y,type='l',col="blue") title(main="lty",sub="Byprogram-dog.blogspot.com") par(opar) #五、关于标识符,一个数据点给一个标识符 #pch 0~25种 x<-seq(-10,10,length.out=20) y1<-0.1*x^2 y2<-0.2*x^2 y3<-0.4*x^2 y4<-0.8*x^2 y5<-1.6*x^2 y6<-3.2*x^2 par(pch=1)#pch1 圆圈 plot(x,y1,type='b',col="red",xlim=c(0,5)) par(pch=2)#pch2 三角 lines(x,y2,type='b',col="blue") par(pch=3)#pch3 加号 lines(x,y3,type='b',col="green") par(pch=4,lty=3)#pch4 乘号 lines(x,y4,type='b',col="red") par(pch=0)#pch5 正方形 lines(x,y5,type='b',col="blue") par(pch=6)#pch6 倒三角 lines(x,y6,type='b',col="green") title(main="pch",sub="Byprogram-dog.blogspot.com") par(opar) plot(x,y1,type='b',col="red",xlim=c(0,5),pch=5)#也可以直接把pch放plot里 #六、线宽 #lwd 线宽 cex 标识符宽 opar<-par(no.readonly=TRUE) x<-seq(1,10,length=20) y<-1/x dev.new() par(mfrow=c(2,1)) plot(x,y,type="b",pch=2,cex=5,lty=3,lwd=1) title(main="lwd=2 and cex=2",sub="Byprogram-dog.blogspot.com", cex.sub=0.5) plot(x,y,type="b",pch=2,cex=1,lty=3,lwd=5) title(main="lwd=1andcex=1",sub="Byprogram-dog.blogspot.com",cex.sub=0.5) par(opar) # x<-seq(1,10,length.out = 20) y<-1/x dev.new() par(pch=2,cex=2,lty=3,lwd=2,mfrow=c(2,1))#1 plot(x,y,type="b") par(pch=2,cex=0.5,lty=3,lwd=1)#2 plot(x,y,type="b") #把命令从plot里拿出来,要注意1.mfrow命令要放在第一个par命令的后面 #2.cex放在par里面就是改了全部的字体大小,而不是只改了标识符宽 #一定要明确par参量的意义,即在恢复默认设置之前,画图用到的参量都以par设置的为准 #若plot里也有对par里面设置出的参量做重新设置,那么以后设置的为准 #七、分界面 par(mfcol=c(3,2))#分作图界面,先按列走 par(mfrow=c(3,2))#分作图界面,先按行走 #建模1】最近邻居算法 K-NN #根据离A最近的邻居的种类取类比推断出A的类别,重点在如何判断“最近” #先把数据的指标画到坐标图中,再找到图中离待判断值比较近的点,作为序列样本 #再计算待判断值跟图中各点的距离,按大小排列好顺序标号,选取最近邻居个数k, #看k里最多的种类是什么,用此来估计待测值的类别,注意k取的不同结果可能不同 #k的选取应该在两个极端值(1 跟 全部数据)之间,一般是图中离待判断值比较近的点的个数 tomato <- c(6,4) grape <- c(8,5) orange <- c(7,3) sqrt(sum((tomato-grape)^2)) sqrt(sum((tomato-orange)^2))#计算两点之间的距离 #数据预处理 #1 数据的范围压缩(归一化):把每一列数据等比例压缩至同一范围(0~1),不改变相对大小关系 #方法1,同除以每列的最大值 #方法2,Xnew=[X-min(X)]/[max(X)-min(X)] #方法3,压缩至(-1,1)之间,用概率 Xnew=[X-Mean(X)]/StdDev(X)(标准差) #不预处理,一些小的数据对距离的影响就会很小,量纲大的占优势,这样相对位置就不太准确 #2 把字符变量变成数值变量,便于距离计算 eg:male=1;female=0 iris sqrt(sum((iris[1,1:4]-iris[150,1:4])^2))#依据前四列数据,计算第1朵花跟150朵花的距离 #一、读数据 setwd('//Users//wangxinran//Desktop//R语言') #判断一个病人是否得病,依据knn算法,将该病人的指标与数据库内的数据比较,由最近邻居得出结论 wbcd <- read.csv('wisc_bc_data.csv',stringsAsFactors = F)#读入数据,把因子变量转换成字符型 #二、查看并分析数据,做简单处理 str(wbcd)#看各类数据的类型分别是什么,diagnosis这一列就显示成chr 而不是 factor wbcd <- wbcd[,-1]#去掉第一列,即id table(wbcd$diagnosis)#看看样本里良性恶性分别是多少,以此来看样本数据是否合理 #尽量让各类样本在数据库里的比重均衡 wbcd$diagnosis <- factor(wbcd$diagnosis,levels=c("B","M"),labels="Benign","Malignant") #想把第一列的字符B、M写成它完整的单词命名,要先改回成因子型,在用labels改名 summary(wbcd[c("radius_mean","area_mean","smoothness_mean")]) #查看数值型变量的一些情况,1st Qu 四分之一分为数 3st Qu 四分之三分为数 #三、归一化 normalize <- function(x){ return((x-min(x))/(max(x)-min(x))) }#自定义一个归一化函数,对数据做预处理,x代表一列向量,return表示要该函数的返回值 wbcd_n <- as.data.frame(lapply(wbcd[,2:31],normalize))#对数据的2~31列归一化 summary(wbcd_n$radius_mean)#查看一下归一化是否成功 #四、取数据 wbcd_train <- wbcd_n[1:469,]#取一部分数据做训练样本,注意训练样本都是数值型的,也叫 #训练特征数据,所以应在归一化后的wbcd_n里取 wbcd_train_labels <- wbcd[1:469,1]#取训练标签(对应训练样本是良性还是恶性),注意 #要去wbcd里取,因为归一化的数据框里已经没有diagnosis这一列了 wbcd_test <- wbcd_n[470:569,]#取测试样本,也叫测试特征数据 wbcd_test_labels <- wbcd[470:569,1]#取测试标签 #从920行开始,如果怕弄错到底是从wbcd里取,还是从wbcd_n里取,可以先把标签跟归一化的数据 #合并成wbcd_n_1,再统一从取wbcd_n_1里取 wbcd_n_1 <- cbind(wbcd$diagnosis,wbcd_n) wbcd_train_1 <- wbcd_n_1[1:469,2:31] wbcd_train_1_labels <- wbcd_n_1[1:469,1] wbcd_test_1 <- wbcd_n_1[470:569,2:31] wbcd_test_1_labels <- wbcd_n_1[470:569,1] #五、引入模型计算 library(class)#取class包是为了要用里面的knn模型 wbcd_test_pred<- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k = 21) #直接用建模模型knn函数来计算测试样本的标签,看看跟我们选出来的真正的测试标签有多大差距 #若差距不大,说明我们取的k跟建立的knn模型比较合适,可以用来做良性恶性的判断 #一般先让k等于训练样本数开平方,注意knn里的各个元素别喂错了 #六、评价模型 1.table 2.CrossTable #1. table(wbcd_test_pred,wbcd_test_labels)#wbcd_test_pred模型得到的,wbcd_test_labels真实的 #评价模型,统计用模型测出来的良性恶性跟真实的良性恶性分别是多少, #并且可以简单验证,统计出来主对角线上的结果是判断对了的个数,其他位置是判断错误的个数 #2. install.packages("gmodels")#用这个包里的CrossTable来评价模型 library('gmodels') CrossTable(wbcd_test_pred,wbcd_test_labels)#CrossTable叫混淆矩阵,把模型得到的跟真实的 #混在一起比较,横纵变量交叉点就是两者重合的,即正确的,其余是模型判断有误的 #表格最前面的Cell Contents会告诉你表格里每一个数据的意思 #Chi-square contribution卡方贡献率 CrossTable(wbcd_test_pred,wbcd_test_labels,chisq = F) #七、模型的改进 1.更换归一化的方法 2.跟换k #1. wbcd_z<- as.data.frame(scale(wbcd[-1]))#scale压缩数值型数据,把每个数据减均值除以标准差 summary(wbcd_z$area_mean) wbcd_train <- wbcd_z[1:469,] wbcd_train_labels <- wbcd[1:469,1] wbcd_test <- wbcd_z[470:569,] wbcd_test_labels <- wbcd[470:569,1] wbcd_test_pred<- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k = 21) table(wbcd_test_labels,wbcd_test_pred)#发现错的更多了 #2 wbcd_test_pred<- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k = 15) table(wbcd_test_labels,wbcd_test_pred)#测试不同的k看哪个好 #用knn实验iris数据 iris <- iris #观察数据:由于iris数据的species是按顺序排列的,直接取前100个数据是不行的 normalize <- function(x){ return((x-min(x))/(max(x)-min(x))) } iris_n <- as.data.frame(lapply(iris[,1:4],normalize)) #第一种选数据的方法 打乱排列顺序,再随机选取 index <- sample(150,120)#随机产生1~150的行号,随机取里面的120个 iris_train <- iris_n[index,] iris_train_labels <- iris[index,5] iris_test <- iris_n[-index,] iris_test_labels <- iris[-index,5] library(class) iris_test_pred<- knn(train = iris_train, test = iris_test, cl = iris_train_labels, k = 11) table(iris_test_labels,iris_test_pred)#产生的sample行号不同,结果不同 #k-折交叉验证 因为sample是随机产生的,所以每次测试样本的结果都不一样,为了判断模型是否 #有效,可以多测试几次不同的sample,取成功结果的比例的平均值 #第二种取数据的方法 每一类随机取一部分 table(iris$Species)#看每一类有几个 index1 <- sample(50,40)#随机产生1~50,50个行标随机取40个 index2 <- sample(51:100,40)#随机产生第51~100个行标随机取40个 index3 <- sample(101:150,40)#随机产生第101~150个行标随机取40个 iris_train <- iris_n[c(index1,index2,index3),] iris_train_labels <- iris[c(index1,index2,index3),5] iris_test <- iris_n[-c(index1,index2,index3),] iris_test_labels <- iris[-c(index1,index2,index3),5] library(class) iris_test_pred<- knn(train = iris_train, test = iris_test, cl = iris_train_labels, k = 11) table(iris_test_labels,iris_test_pred) #第三种取数据的方法 每一类顺序取前40个 iris_train <- iris_n[c(1:40,51:90,101:140),] iris_train_labels <- iris[c(1:40,51:90,101:140),5] iris_test <- iris_n[-c(1:40,51:90,101:140),] iris_test_labels <- iris[-c(1:40,51:90,101:140),5] library(class) iris_test_pred<- knn(train = iris_train, test = iris_test, cl = iris_train_labels, k = 11) table(iris_test_labels,iris_test_pred) #第四种取数据的方法 打乱排列顺序,再顺序选取 index<-sample(150) iris<-iris[index,] iris_n<-iris_n[index,] iris_train<-iris_n[1:120,] iris_train_labels<-iris[1:120,5] iris_test<-iris_n[121:150,] iris_test_labels<-iris[121:150,5] iris_test_pred<- knn(train = iris_train, test = iris_test, cl = iris_train_labels, k = 11) table(iris_test_pred,iris_test_labels) #发现:就算用样本数据去测试样本数据,结果也不一定全部成功 #第七章 读取及存储文件 #read.table一般用于读txt文件,其数据之间的分隔符号是空格形式,read.table读取空格分隔的数据 #read.csv一般用于读取csv文件,其数据之间的分隔符号是逗号形式,read.csv读取逗号分隔的数据 #当用read.table去读csv文件时,要用sep把分隔符改成逗号。read.csv则不用 #当用read.csv去读txt文件时,要用sep把分隔符改成空格。read.table则不用 #!!在读数据之前,要先看看数据之间的分隔符号,在读取时用sep把数据之间的格式修改 setwd('//Users//wangxinran//Desktop//R语言') wine178 <- read.table(file='wine178.csv',header=T,sep=',') wine178_1 <- read.csv(file='wine178.csv',header=T) winequality_white <- read.csv(file='winequality-white.csv',sep=';') winequality_white_1 <- read.table(file='winequality-white.csv',header=T,sep=';') #read.table默认header=F,想要表头必须要加header=T,但read.csv默认header=T,可以不加 winequality_white_2 <- read.csv2(file='winequality-white.csv') #read.csv2读取时默认数据之间的分隔符号是分号;, HW <- read.table(file='HW.txt',header=T) HW_1 <- read.csv(file='HW.txt',sep='',header=T) usedcars <- read.table(file="usedcars.csv",sep=',',header=T) usedcars_1 <- read.table("usedcars.csv") str(usedcars) mushrooms <- read.csv(file='mushrooms.csv') mushrooms_1 <- read.table(file='mushrooms.csv',header=T,sep=',') str(mushrooms) #读取excel文件 install.packages('readxl') library('readxl') #安装'readxl'后用read_excel()命令可以读excel文件 #或者把.xls、.xlsx文件转化成.csv或.txt文件,再来读取,直接文件另存为就行了 temp_1 <- read_excel('temp_1.xlsx') #也可以用如s下方法:File-》input dataset -》from excel-》把文件名跟位置拷贝过来 score <- sample(85:100,36,replace=T)#随机产生在85~100之间的数字36个 temp_1$score <- score#把score添加到temp_1表格中,新添一列 #readLines 读取纯文本 abstract <- readLines('abstract.txt')#读入文件,逐行读取文本 abstract data<-readline()#从键盘中一行一行获取信息 #从键盘中输入想要的文字: I am a student data #用scan读数据 wine178_scan <- scan(file='wine178.csv',sep=',',skip=1)#skip=1向下一行再读,第一行不要 #scan()读取速度比较快,适用于大型数据,但第一行的字符型数据读不进去,且读进来不是数据框形式 #需要做如下改变,变成数据框并且加上表头第一行 wine178_Matrix <- matrix(wine178_scan,nrow=178,byrow=T) wine178_dataframe <- as.data.frame(wine178_Matrix) colnames(wine178_dataframe) <- c('Alcohol','Malic' ,'acid', 'Ash Alcalinity of ash' , 'Total' ,'phenols', 'Flavanoids','Nonflavanoid','phenols' ,'Proanthocyanins', 'Color', 'intensitys' ,'Hue','wines') usedcars_scan <- scan(file='usedcars.csv',what='character',sep=',',skip=1) #如果数据是字符形式,要加what='character',数据是numbeic不要紧 usedcars_Matrix <- matrix(usedcars_scan,nrow = 150,byrow = T) usedcars_dataframe <- as.data.frame(usedcars_Matrix) colnames(usedcars_dataframe) <- c('year','model','price','mileage','color','transmission') #用write储存文件,将temp_1文件以新的文件名存储到指定目录下 write.table(temp_1,file="//Users//wangxinran//Desktop//R语言//temp_2.txt") write.csv(temp_1,file="//Users//wangxinran//Desktop//R语言//temp_3.csv") #也可以先将该目录改成当前目录,再储存时就不用指定了 setwd('//Users//wangxinran//Desktop//R语言') write.table(temp_1,file="temp_2_2.txt")#write.table储存txt文件 write.csv(temp_1,file="temp_3_2.csv")#write.csv储存csv文件 write.csv(temp_1,file="temp_3_3.csv",row.names = F)#储存时不要行名字 write.table(temp_1,file="temp_2_3.txt",row.names = F,quote=F) #quote=F去掉双引号 iris <- iris iris_sub <- iris[,1:4] write.table(iris_sub,file='iris_sub.txt') write.csv(iris_sub,file ='iris_sub.csv' ) #用cat存储一些新产生的数据到当前目录下 setwd('//Users//wangxinran//Desktop//R语言') cat(1:10,file='temp11.txt') cat(cbind(iris$Sepal.Length,iris$Petal.Length),file='iris_length.txt') #用save存储.Rdata类型的文件,它是R语言下自己的文件格式,必须用R语言打开 setwd('//Users//wangxinran//Desktop//R语言') save(iris_sub,file='iris_sub.Rdata') save(list=ls(all=T),file="alldata.Rdata")#把environment里所有变量存盘 #给数据排序 sort rank order S <- sample(40:55,8,replace=T) sort(S)#把数据从小到大排序 sort(S,decreasing = T)#把数据从大到小排序 y <- c("wxr","bzx","skm","lxy") sort(y) #先按首字母排,如果首字母一样就比较第二个字母 order(S)#给出数据从小到大,在原始数据S中所在的位置 #给某个数据排序 library('readxl') temp_1 <- read_excel('temp_1.xlsx') score <- sample(85:100,36,replace=T)#随机产生在85~100之间的数字36个 temp_1$score <- score#把score添加到temp_1表格中,新添一列 order(temp_1$score)#显示第一个数据在原始数据中排第几,第二个数据在原始数据中排第几.... temp_2 <- temp_1[order(temp_1$score),]#给temp_1按成绩排序 S <- sample(40:55,8,replace=T) S rank(S) #表示原始数据在排序后的序列里的位置,如果有相同数据排序,那么这个位置就取两个位置的平均值 #第一个数据在新数据中按从小到大顺序应该排第几,第二个... #stack 自我补充,不作要求 #stack()函数:(堆栈的意思) #长宽型数据的转换,长型:堆栈,数据间有不同的分类(如同属一类);宽型:数据内容相对唯一 freshman <- c(12,23,24) sophomores <- c(25,36,73) juniors <- c(32,46,57) data.frame(fr= freshman,so = sophomores,jun = juniors) height <- stack(list(fresh =freshman,sopho = sophomores,juni = juniors)) height tapply(height$values,height$ind,mean) #按照分类求均值 #练习,打开temp_1.xlsx文件,随机产生性别跟成绩,按成绩排序,并按性别求平均值 setwd('//Users//wangxinran//Desktop//R语言') library('readxl') temp_1 <- read_excel('temp_1.xlsx') score <- sample(85:100,36,replace=T) temp_1$score <- score temp_1 <- temp_1[order(temp_1$score),] sex <- sample(c("F","M"),36,replace=T) temp_1$sex <- sex tapply(temp_1$score,temp_1$sex,mean) write.csv(temp_1,file="temp_1.csv") #条件判断及循环 x<-3 y<-5 if(x<4)print("I want to go to school !") if(x<1)print("I want to go to school !") if(TRUE)print("I want to go to school !") if(x<4|y>8)print("I want to go to school !") if(x<4&y>8)print("I want to go to school !") if(x>5)print('x>5')else print("x<=5") if(x>5)print("I want to go to school !")else #注意else必须跟if在同一行 print("I stay at home") if(x>4){ z = x+y; print("z is :") print(z) }else { print("z is not exist") }#条件满足的情况下,{}内所有的语句都会执行,条件不满足时执行else里所有的语句 #注意else必须紧跟在if结束的}位置 #if、else开始的{可以不紧跟在他们各自的后面,可以写在下一行 #如果if else在for循环里,else就可以不紧跟在if后面,可以写在下一行 teens <- read.csv("snsdata.csv") teens <- ifelse(teens$age>15&teens$age<18,teens$age,NA) #for循环 sum_x <- 0 x <- c(3,8,7,2,1,3,9,60,30,12) for(i in x){ sum_x <- sum_x+i } sum_x y <- 0 for(i in 1:dim(iris)[1]){ y <- y+iris$Sepal.Length[i] } y#求150个iris$Sepal.Length数据的和,dim(iris)[1]是iris的行数:150 y/dim(iris)[1]#求Sepal.Length的平均值 S <- 0#赋初值 for(n in 1:(10^5)){ S <- S+sqrt(3)/(2^n) } S iris_na <- iris for(i in 1:4){ iris_na[sample(1:nrow(iris),5,replace = F),i] <- NA } #在iris数据的第1~4列中,每一列里面都从150行里随机抽取5行(且不重复),把该位置数据变成NA which(is.na(iris_na$Sepal.Length))#找到iris_na$Sepal.Length里NA所在的位置是第几行 for(i in 1:4){ iris_na[which(is.na(iris_na[,i])),i] <- mean(iris_na[,i],na.rm=T) } iris_na # 把每一列里NA的位置,用这一列除了NA之外的数据所计算出来的平均值代替 mean(c(2,4,NA,6,8),na.rm=T)#na.rm=T去掉缺失值 #或者用以下方法,先求均值,再进行for循环 Mean_value <- sapply(iris_na[,1:4],mean,na.rm=T) for(i in 1:4){ iris_na[which(is.na(iris_na[,i])),i] <- Mean_value[i] } iris_na #while S <- 0 n=1 while(n<=(10^5)){ S <- sqrt(3)/(2^n) n=n+1 } S #repeat f <- vector() f[1] <- 1 f[2] <- 1 i=3 repeat{ f[i]=f[i-1]+f[i-2] if((f[i])>=1000)break i <- i+1 } f #switch 给它一个执行的位置比如1,它就执行第一个位置的操作 i=1 switch(i,mean(1:10),rnorm=10,print("I Love you"))#执行mean(1:10)求均值(第一项) switch(i+1,mean(1:10),rnorm=10,print("I Love you"))#执行rnorm=10产生10个随机数(第二项) switch(i+2,mean(1:10),rnorm=10,print("I Love you"))#执行print(第三行) set.seed()#()填初始种子点,随便填个自然数就行 #在执行rnorm或sample时先执行set.seed(自然数),就可以使每次产生的随机数都是一样的 #注意,每次都要运行一遍seed set.seed(1) rnorm(10)#rnorm产生服从标准正态分布的数 set.seed(113) sample(85:100,10,replace = T) #定义自己的函数 my_fun <- function(x,y) sin(x)+2*y my_fun(3,8) #做一个复杂计算,用大括号 twosam <- function(x1, x2) { n1 <- length(x1); n2 <- length(x2) xb1 <- mean(x1); xb2 <- mean(x2) s1 <- var(x1); s2 <- var(x2) s <- ((n1-1)*s1 + (n2-1)*s2)/(n1+n2-2) tst<- (xb1 - xb2)/sqrt(s*(1/n1 + 1/n2)) tst #或者写成 return(tst), 还可以返回两个量,比如:return(list(tst, s)) }#return两个值的时候,必须把他们放到list里 x1<-c(1,2,3,3,4,5,6,7,8) x2<-c(2,4,5,8,9,8) a<-twosam(x1,x2) a #画分段函数图像 #method 1 My_f =function(x) { v1=2*x[x<=-1]+3 v2=((x+3)/(x+3))[(x>-1)&(x<=1)]#1要换成(x+3)/(x+3),直接写1会报错 v3=x[x>1]^2 y=c(v1,v2,v3) return(y) } #下面调用函数 x=c(-5:5) y=My_f(x) plot(x,y,type='l') #method2 My_fun <- function(x){ if(x<=-1) y <- 2*x+3 else if((x>-1)&(x<=1)) y <- 1 else y <- x^2 return(y) } x <- seq(-3,3,0.1) y <- vector()#y不能直接调用函数产生,需要用for循环把它的值放到一个vector里 for(i in 1:length(x)){ y[i] <- My_fun(x[i]) }#i指的是循环的次数,所以要注意(i in 1:length(x))而不是(i in x) y plot(x,y,type='l') #定义一个二元运算 par(family="Sarasa Gothic CL") "呵呵" <- function(x,y){cos(x)*sin(y)} x <- c(1,2,3) y <- c(4,5,6) 呵呵(x,y) #x"hehe"y不可用 "%!%" <- function(x, y) { cos(x)*sin(y)} x<-c(1,2,3) y<-c(4,5,6) x%!%y #%!%(x,y)不可用 #函数的默认参数,如果不再赋值就用默认参数,后面如果有赋值,就用新的值 #缺省参数,把缺省参数"..."用大函数function里面的小函数比如summary来补上 my_func <- function(x, ...){ print(x) summary(...) } my_func("This is iris data:", iris) #函数里面的变量是局部变量,对全局没有影响 #线性回归 setwd('//Users//wangxinran//Desktop//R语言') insurance.df <- read.table(file='Q1_Policies.txt',header=T) #第一题,求回归系数 0.5134 attach(insurance.df) #attch之后,在引用该数据中的某个变量就不用再写$了,全部已用完后用detach释放掉 insurance.lm <- lm(Policies~Quotes)#做回归,看回归系数 insurance.lm <- lm(Policies~Quotes,data=insurance.df)#当attach了不止一个数据时,要用data指明 insurance.lm summary(insurance.lm)#可以看到更多的回归的结果 #Residual standard error 残差的标准误差(标准化残差):3.451 拟合数据的自由度:58 #R-squared决定系数,越接近1说明模型拟合越好,一般一元回归看Multiple,二元回归看Adjusted #*星号表示其对应量的显著程度 #第二题, 求回归系数的95%置信区间 [0.5134-2.001717*0.03308,0.5134+2.001717*0.03308] qt(0.975,58)#求自由度为58的t分布的0.975分位数,=2.001717 #0.03308是标准误差Std. Error,可以从summary中得到 #第三题 用三种方法 P值、F分布、t分布 判断上述求得的回归系数在置信水平为95%时是否有效 #可以从summaty中得到t统计量跟F统计量 t value: 15.523 F-statistic:241 #也可以得到P值:p-value:< 2.2e-16,由于P<1-置信水平(0.05),所以我们算得的回归系数有效 #我们可以通过计算F(置信水平)(p,n-p-1) 跟上述得到的F比较,看该回归系数是否有效 qf(0.95,1,58)#求自由度是95%的F分布的(1,58)分位数 #算得qf(0.95,1,58)=4.006873<241,说明自变量对因变量有重要影响 #我们也可以通过计算t(1-置信水平) 跟上述得到的t比较,看该回归系数是否有效 qt(0.05,58) #算得qt(0.05,58)=-1.671553,其绝对值< 15.523,说明自变量对因变量有重要影响 #第四题 用该回归去预测自变量是50时,因变量预测值的期望(E(y估计))的95%置信区间 predict(insurance.lm,data.frame(Quotes=50),se.fit=T,interval='confidence',level=0.95) #predict(lm(y~x),new,interval=“prediction”,level=0.95) #——预测,lm(y~x)为之前通过训练数据拟合的回归方程;new为待预测的输入数据,其类型必须为数据框 #interval='confidence'表明想要y的期望的区间估计,interval='prediction' 表明想要y的区间估计 #level是置信水平 se.fit=T表示需要标准误差,=F则不需要 #结果中:fit表示自变量是50时因变量预测值(y估计),lwr跟upr是你想求区间的上下限 #se.fit是E(y估计)公式中的最后一部分 df是拟合的自由度 residual.scale是残差的标准误差Sxx #E(y估计)的置信区间=[y估计+t0.975(58)*se.fit,y估计-t0.975(58)*se.fit] #第五题 用该回归去预测自变量是50时,因变量预测值(y估计)的95%置信区间 predict(insurance.lm,data.frame(Quotes=50),se.fit=T,interval='prediction',level=0.95) #y估计的置信区间=[y估计+t0.975(58)*se.pred,y估计-t0.975(58)*se.pred] #其中(se.pred)^2 = (se.fit)^2+(residual.scale)^2 #第六题 用该回归去预测自变量是40时,因变量预测值(y估计)的95%置信区间 #还可以把五、六题一起计算 predict(insurance.lm,data.frame(Quotes=c(50,40)),se.fit=T,interval='prediction',level=0.95) plot(insurance.lm)#画图 #第一个图 残差大的数据在图中被标注了出来,残差点最好是随机分布的 residuals(insurance.lm)#计算残差 rstudent(insurance.lm)#计算删除学生残差 which(abs(rstudent(insurance.lm))>=3)#看删除学生残差中有没有大于3的,abs取绝对值 #第二个图 qq图,如果数据点基本在虚线附近(紧紧围绕直线),说明样本残差符合正态分布 #第三个图 标准化残差方根散点图,被标出来的点说明残差方跟较大,对回归影响不好,可以剔除 #第四个图 残差与杠图,横坐标是杠杆值,纵坐标是残差值,可以看两者的范围 #当杠杆值超过两倍或三倍的h杠,就说有高杠杆值点,但超过的这些点是否是异常点还要结合cook距离 cooks.distance(insurance.lm)#看各样本点的cook距离 hatvalues(insurance.lm)#看各样本点的杠杆值 plot(insurance.lm,which=c(1:6))#可以画出更多的图,比如cook距离 y=c(144,215,138,145,162,142,170,124,158,154,162,150,140,110,128,130, 135,114,116,124,136,142,120,120,160,158,144,130,125,175) x=c(39,47,45,47,65,46,67,42,67,56,64,56,59,34,42,48,45,18,20 ,19,36,50,39,21,44,53,63,29,25,69) plot(y~x,type = 'p') xueya_nianling.lm <- lm(y~x) summary(xueya_nianling.lm) plot(xueya_nianling.lm) rstudent(xueya_nianling.lm) which(abs(rstudent(xueya_nianling.lm))>=3) cooks.distance(xueya_nianling.lm) which(abs(cooks.distance(xueya_nianling.lm))>1) h <-((1+1)/30) 2*h 3*h x <- x[-2] y <- y[-2] xueya_nianling.lm <- lm(y~x) summary(xueya_nianling.lm) which(abs(rstudent(xueya_nianling.lm))>=3) qt(0.975,27) qf(0.95,1,27) predict(xueya_nianling.lm ,data.frame(x=50),se.fit=T,interval='confidence',level=0.95) predict(xueya_nianling.lm ,data.frame(x=50),se.fit=T,interval='prediction',level=0.95) predict(xueya_nianling.lm ,data.frame(x=60),se.fit=T,interval='confidence',level=0.95) #2 y=c(144,215,138,145,162,142,170,124,158,154,162,150,140,110,128,130,135,114,116, 124,136,142,120,120,160,158,144,130,125,175) x1=c(39,47,45,47,65,46,67,42,67,56,64,56,59,34,42,48,45,18,20,19,36,50,39,21,44, 53,63,29,25,69) x2=c(24.2,31.1,22.6,24.0,25.9,25.1,29.5,19.7,27.2,19.3,28.0,25.8,27.3,20.1,21.7, 22.2,27.4,18.8,22.6,21.5,25.0,26.2,23.5,20.3,27.1,28.6,28.3,22.0,25.3,27.4) x3=c(0,1,0,1,1,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,1,0,1,0,1) Pressure.lm <- lm(y~x1+x2+x3) summary(Pressure.lm) plot(Pressure.lm) #从图上可以看出2号跟10号有些异常,现在用删除学生残差杆看一下 which(abs(rstudent(Pressure.lm))>=3) #剔除2,10 y <- y[-c(2,10)] x1 <- x1[-c(2,10)] x2 <- x2[-c(2,10)] x3 <- x3[-c(2,10)] #重新做回归 Pressure.lm <- lm(y~x1+x2+x3) summary(Pressure.lm) plot(Pressure.lm) #重新检测回归 which(abs(rstudent(Pressure.lm))>=3) which(abs(cooks.distance(Pressure.lm))>1) predict(Pressure.lm,data.frame(x1=43,x2=23.2,x3=1),se.fit=T, interval='confidence',level=0.95) predict(Pressure.lm,data.frame(x1=43,x2=23.2,x3=1),se.fit=T, interval='prediction',level=0.95) #正态假设检验,单个正态总体,方差未知且相等t检验 #一、右边检验 X<-c(159,280,101,212,224,379,179,264,222,362,168,250,149,260,485,170) t.test(X,alternative="greater",mu=225) #看p值,>0.05,不能拒绝原假设,接受H0 #计算t统计量qt(0.95,15)=1.75305,与上述得到的t=0.66852比较,0.66852<1.75305,接受H0 #alternative hypothesis:显示的是备择假设,由此我们可以知道原假设 #mean of x 上述数据x的均值 #二、左边检验 t.test(X,alternative="less",mu=225) #p=0.743>0.05,接受H0 #计算qt(0.05,15),df表示自由度是15,0.66852>-1.75305,接受H0 #由于左边右边的假设结果一个是mu<=225,一个是mu>=225,所以做双边假设 #三、双边假设 t.test(X,alternative="two.sided",mu=225) #qt(0.975,15)=2.13145,0.66852绝对值<2.13145,接受原假设,所以最后答案 mu=225 #综上,这个题三种检验都要做,因为前两种得到结果恰好相反,所以猜测只能取=号 #多个正态总体 #方法一 X<-c(78.1,72.4,76.2,74.3,77.4,78.4,76.0,75.5,76.7,77.3) Y<-c(79.1,81.0,77.3,79.1,80.0,79.1,79.1,77.3,80.2,82.1) t.test(X,Y,var.equal=TRUE, alternative="less") #由p<0.05,拒绝原假设 #qt(0.05,18)=-1.734064, -4.2957<-1.734064,拒绝原假设 #方法二,letZ=X-Y,mu=0,Z跟mu比较,该换成单个正态总体 t.test(X-Y,mu=0, alternative="less") #qt(0.05,9)=-1.833113 -4.2018<-1.833113 拒绝原假设 #p=0.00115<0.05 拒绝原假设 #神经网络模型 #蠓虫分类问题:现在有两种虫子Af、Apf,根据数据判断虫子属于哪一种 #每只虫子有两个数据,现在样本有两种虫子分别是9只、6只,根据样本建立模型并测试 #读入数据 MengChong<-read.table('MengChong.txt',sep=",",header = T) #归一化 normalize <- function(x) { return ((x - min(x)) / (max(x) - min(x))) } MengChong_n <- as.data.frame(lapply(MengChong[,1:2], normalize)) #取训练样本跟标签、测试样本跟标签 train_data<-as.matrix(MengChong_n); test_data<-as.matrix(MengChong_n); train_labels<-as.numeric(MengChong[,3]) test_labels<-train_labels #newff构建神经网络 install.packages("AMORE") library(AMORE) net <- newff(n.neurons=c(2,8,2,1), learning.rate.global=1e-2, momentum.global=0.5, error.criterium="LMS", Stao=NA, hidden.layer="tansig", output.layer="purelin", method="ADAPTgdwm") #神经网络有4层,依次是:‘2’输入层 2个圈、‘8’隐藏层 8个圈、‘2’隐藏层 2个圈、‘1’输出层 1个圈 #输入层的圈个数是看输入的每个样本有几个数据,输出层的圈个数是看输出的样本属于几个类别 #输入训练样本用该网络构建一个训练,并把该训练赋值为result result <- train(net, train_data, train_labels, error.criterium="LMS", report=TRUE, show.step=100, n.shows=5 ) #用测试样本测试上述训练,看用该训练得到的测试样本的结果是什么 y <- sim(result$net, test_data) #比较测试样样本真实的结果跟用训练result产生的结果比较 y[which(y<1.5)] <- 1 y[which(y>=1.5)] <- 2 table(test_labels,y) #计算该训练的正确率 n=length(test_labels) Sum = 0 for(i in 1:n){ if(y[i]==test_labels[i]){ Sum =Sum+1 } } cat("正确率", (Sum/n)*100, "%") #现在新来三只虫子的数据,想用训练判断他们的类别分别是什么 x<-rbind(c(1.24,1.80),c(1.28,1.84),c(1.40,2.04)) #用x储存这三只虫子的数据,一行是一只,第一列是antenna,第二列是wing #对新来这三只做归一化,要用到原来训练数据各个属性值的最大和最小值 a<-x[,1] b<-x[,2] a1<-(a-min(MengChong[,1]))/(max(MengChong[,1])-min(MengChong[,1])) b1<-(b-min(MengChong[,2]))/(max(MengChong[,2])-min(MengChong[,2])) x_n<-cbind(a1,b1) #输入归一化好的数据到训练中,用训练判断类别(即测试x_n) y1 <- sim(result$net, x_n) y1 #y1跟1接近,class就是1,跟2接近class就是2 #发现y1中的数据在1.5左右,跟1和2都不太接近,需要修改 #方法一:修改网络层中的第二层跟第三层的圈数,重新训练 net <- newff(n.neurons=c(2,8,1), learning.rate.global=0.5, momentum.global=0.5, error.criterium="LMS", Stao=NA, hidden.layer="tansig", output.layer="purelin", method="ADAPTgdwm") #方法二 扩大样本数据 #方法三 给样本的每类数据加上不同的权重,关系大的一类权重大 #由于上述原数据相差不大,可以不用归一化,如下: train_data<-as.matrix(MengChong[,1:2]); test_data<-train_data; train_labels<-c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2) test_labels<-train_labels library(AMORE) net <- newff(n.neurons=c(2,8,2,1), learning.rate.global=1e-2, momentum.global=0.5, error.criterium="LMS", Stao=NA, hidden.layer="tansig", output.layer="purelin", method="ADAPTgdwm") result <- train(net, train_data, train_labels, error.criterium="LMS", report=TRUE, show.step=100, n.shows=5 ) y <- sim(result$net, test_data) y[which(y<1.5)] <- 1 y[which(y>=1.5)] <- 2 table(test_labels,y) n=length(test_labels) Sum = 0 for(i in 1:n){ if(y[i]==test_labels[i]){ Sum =Sum+1 } } cat("正确率", (Sum/n)*100, "%") x<-rbind(c(1.24,1.80),c(1.28,1.84),c(1.40,2.04)) y1 <- sim(result$net, x) y1 #神经网络之拟合 #样本为每月的销售量,用来预测下一个月的销售量 sales<-read.table('sales.txt',header = F) sales_n<-(sales-min(sales))/(max(sales)-min(sales)) sales_T<-sales_n[4:9,] Train_data<-rbind(sales_n[1:3,],sales_n[2:4,],sales_n[3:5,], sales_n[4:6,],sales_n[5:7,],sales_n[6:8,])#取训练样本的方法见图片 Train_labels<-sales_T Test_data<-Train_data Test_labels<-sales_T library(AMORE) set.seed(12345) net <- newff(n.neurons=c(3,5,1), learning.rate.global=1e-2, momentum.global=0.5, error.criterium="LMS", Stao=NA, hidden.layer="tansig", output.layer="purelin", method="ADAPTgdwm") result <- train(net, Train_data, Train_labels, error.criterium="LMS", report=TRUE, show.step=100, n.shows=5 ) y <- sim(result$net, Test_data) Y<-y*(max(sales)-min(sales))+min(sales)#返归一化,把压缩后的数据还原回去 real_Y<-sales[4:9,]#取出真实的值 plot(1:6,Y,xlim = c(1,6),ylim = c(1300,3000)) points(1:6,real_Y,col='blue',pch=15)#通过图形来比较真实值跟拟合值 ?newff #可以看到激活函数的种类 #用另一个包来建立神经网络 Train_data1<-cbind(Train_data,Train_labels) #install.packages("neuralnet") library(neuralnet) set.seed(12345) # to guarantee repeatable results as.data.frame(Train_data1)->Train_data1 sales_model <- neuralnet(formula = Train_labels~ V1 + V2 + V3,data =Train_data1) #关于neuralnet包,要求数据用dataframe的形式, #要先as.data.frame(Train_data1)->Train_data1把Train_data1转换成数据框的形式 plot(sales_model) model_results <- compute(sales_model, Test_data) predicted_sales <- model_results$net.result real_Y<-sales[4:9,] y=predicted_sales Y<-y*(max(sales)-min(sales))+min(sales) plot(1:6,Y,xlim = c(1,6),ylim = c(1300,3000)) points(1:6,real_Y,col='blue',pch=15) #sign()a符号函数,输入负数输出-1,输入正数输出1,输入0输出0 #计算例题output #method 1 w1 <- 0.3 w2 <- 0.4 w3 <- 0.5 x1 <- 1.24 x2 <- 1.37 x3 <- 1.56 T <- 0.3 o <- sign(w1*x1+w2*x2+w3*x3-T) #method 2 w0 <- T x0 <- -1 W <- c(w0,w1,w2,w3) X <- c(x0,x1,x2,x3) o <- sign(W%*%X) #iris_newff iris<-iris iris$Species<-factor(iris$Species,levels = c("setosa","versicolor","virginica"), labels = c("1","2","3")) iris$Species<-as.numeric(iris$Species) #for (i in 1:5) { # iris[,i] <- as.numeric(as.vector(iris)[,i]) #} #normalize <- function(x) { # return ((x - min(x)) / (max(x) - min(x))) #} #iris_n <- as.data.frame(lapply(iris[,1:4], normalize)) #train_data<-iris[c(1:40,51:90,101:140),1:4] #test_data<-iris[c(41:50,91:100,141:150),1:4] #train_labels<-iris[c(1:40,51:90,101:140),5] #test_labels<-iris[c(41:50,91:100,141:150),5] #另一种选训练测试样本的方法 train_index <- c(sample(1:50,40),sample(51:100,40),sample(101:150,40))#产生训练样本的行标 train_data <- iris[train_index,1:4] test_data <- iris[-train_index,1:4] train_labels <- iris[train_index,5] test_labels <- iris[-train_index,5] library(AMORE) net <- newff(n.neurons=c(4,8,2,1), learning.rate.global=1e-2, momentum.global=0.5, error.criterium="LMS", Stao=NA, hidden.layer="tansig", output.layer="purelin", method="ADAPTgdwm") #隐藏层8,2都是自己决定,主要注意4:iris一个数据有4个分量,1:最后判断种类,一个数据只对应一种 result <- train(net, train_data, train_labels, error.criterium="LMS", report=TRUE, show.step=100, n.shows=5 ) y <- sim(result$net, test_data) y[which(y<1.5)] <- 1 y[which(2<=y&y<3)] <- 2 y[which(y>=3)] <- 3 y<-as.numeric(y) n=length(test_labels) s<-0 for(i in 1:n){ if(y[i]==test_labels[i]){ s<-c(s+1) } } cat("正确率", (s/30)*100,"%") setwd('//Users//wangxinran//Desktop//R语言') wine178_n <- read.csv('wine178.csv') wine178_n$class<-as.numeric(wine178_n$class) table(wine178_n[,14]) normalize <- function(x){ return((x-min(x))/(max(x)-min(x))) } wine178 <- as.data.frame(lapply(wine178_n[,-14],normalize)) train_index <- c(sample(1:59,50),sample(60:130,60),sample(130:178,40))#产生训练样本的行标 train_data <- wine178[train_index,1:13] test_data <- wine178[-train_index,1:13] train_labels <- wine178_n[train_index,14] test_labels <- wine178_n[-train_index,14] library(AMORE) net <- newff(n.neurons=c(13,8,2,1), learning.rate.global=1e-2, momentum.global=0.5, error.criterium="LMS", Stao=NA, hidden.layer="tansig", output.layer="purelin", method="ADAPTgdwm") result <- train(net, train_data, train_labels, error.criterium="LMS", report=TRUE, show.step=100, n.shows=5 ) y <- sim(result$net, test_data) y[which(y<1.5)] <- 1 y[which(2<=y&y<3)] <- 2 y[which(y>=3)] <- 3 y<-as.numeric(y) n=length(test_labels) s<-0 for(i in 1:n){ if(y[i]==test_labels[i]){ s<-c(s+1) } } cat("正确率", (s/30)*100,"%")