lym

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]<scoresF1[3]

#矩阵就是一个二维的数组

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 <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,"%")

最后编辑于
© 著作权归作者所有,转载或内容合作请联系作者

推荐阅读 更多精彩内容