732A99 Block 1 · R cheatsheet

732A99 Block 1 · R cheatsheet

为 Fan Wenlin 整理,2026-11-10(瑞典时间)。正文中文,R 名称和术语保留英文。 来源和标记: 📌 = Lisam slides(文件名 + PDF 页码;slides 在 Lisam 上,这里只给出处,不附文件); 📝 = 课程公开 R tutorials:Tut1、Tut2(Ex = Exercise 编号); ⚠️ = slides 和 tutorials 里都没有,是包的标准用法,具体以 lab 说明为准。 代码里的 data、train、y 等都是占位名。

1. 课程约定(先看这一节)

1.1 set.seed(12345)

slides 原话:"Use set.seed(12345) in the labs to get identical results" 📌 Lecture 1a block 1.pdf p.26、Lecture 2a block 1.pdf p.20、Lecture 1c block 1.pdf p.25

set.seed(12345)   # 函数名 set.seed,数字是五位 12345
情况 要不要 set.seed(12345) 来源
sample() 划分数据 要,每次 sample 前都调用一次(三段划分里调用两次) 📌 Lecture 1a block 1.pdf p.26
cv.tree()(随机分 fold) 要,slides 在 cv.tree 前又调用了一次 📌 Lecture 2b block 1.pdf p.26
cv.glmnet()(随机分 fold) 要 ⚠️ 原理同上
cvFit()(foldType="random" 时) 要,或者传 seed= 参数 ⚠️(slides 用的是 consecutive,不需要随机数)📌 Lecture 2a block 1.pdf p.34
rnorm/runif/... 模拟数据 要 📌 Lecture 1c block 1.pdf p.25
neuralnet() 初始权重、fastICA() 初始矩阵、kmeans() 要 ⚠️
lm、glm、tree(不剪枝)、prcomp、glmnet(固定 λ)、optim 不需要(确定性算法)

1.2 数据划分(照抄 slides 的写法)

train/test = 70/30 📌 Lecture 1a block 1.pdf p.26、Lecture 2a block 1.pdf p.20

n=dim(data)[1]
set.seed(12345)
id=sample(1:n, floor(n*0.7))
train=data[id,]
test=data[-id,]

train/valid/test = 40/30/30 📌 Lecture 1a block 1.pdf p.26、Lecture 2a block 1.pdf p.20

n=dim(data)[1]
set.seed(12345)
id=sample(1:n, floor(n*0.4))
train=data[id,]
id1=setdiff(1:n, id)
set.seed(12345)
id2=sample(id1, floor(n*0.3))
valid=data[id2,]
id3=setdiff(id1,id2)
test=data[id3,]

1.3 误差函数与 confusion matrix

📌 误差定义见 Lecture 1a block 1.pdf p.27;table 和 diag 见 Lecture 1c block 1.pdf p.16;missclass 函数见 Lecture 1c block 1.pdf p.31

mse = function(y, yhat) mean((y - yhat)^2)
missclass=function(X,X1){          # slides 原样
  n=length(X)
  return(1-sum(diag(table(X,X1)))/n)
}
cm = table(test$y, pred)            # 行 = 真实值,列 = 预测值
# cross-entropy(p 是 n×M 的概率矩阵,列顺序和 levels(y) 一致)
ce = -sum(log(pmax(p[cbind(1:n, as.integer(y))], 1e-15)))  # pmax 防止 log(0) = -Inf
tab=table(y, pred); TP=tab[1,1]; FN=tab[1,2]; FP=tab[2,1]; TN=tab[2,2]
TPR=TP/(TP+FN); FPR=FP/(FP+TN); prec=TP/(TP+FP)

1.4 Scaling:只在 train 上 fit

📌 Lecture 1d block 1.pdf p.15–16、Lecture 2d block 1.pdf p.17;📝 Tut1 Prob. Ex8

library(caret)
scaler=preProcess(train)        # 默认 method=c("center","scale")
trainS=predict(scaler,train)
validS=predict(scaler,valid)    # 用 train 的均值和方差
testS=predict(scaler,test)

2. 课程里用到的函数和包

2.1 lm:线性回归

📌 Lecture 1c block 1.pdf p.26、Lecture 1d block 1.pdf p.11–14、Lecture 1d block 1.pdf p.16;📝 Tut1 Prob. Ex6

fit=lm(Price~Year+Mileage+Equipment, data=train)   # 也可以写 y~. 表示用所有其他列
summary(fit); coef(fit); confint(fit, level=0.95)
fitted(fit); residuals(fit)
pred=predict(fit, newdata=test)
ci=predict(fit, newdata=test, interval="confidence")  # 列名 fit/lwr/upr
pi=predict(fit, newdata=test, interval="prediction")
mean((test$Price-pred)^2)                              # test MSE

2.2 glm:logistic regression;nnet::multinom:多类

📌 Lecture 1d block 1.pdf p.33;📝 Tut1 Prob. Ex9、Tut2 Ex2

m=glm(y~., data=train, family="binomial")    # y 必须是两类的 factor(或 0/1)
p=predict(m, newdata=test, type="response")   # 概率,对应 levels(y)[2]
pred=ifelse(p>0.5, levels(train$y)[2], levels(train$y)[1])
table(test$y, pred)

library(nnet)                                 # 多于两类时
mm=multinom(y~., data=train)
predict(mm, newdata=test, type="class")       # 或 type="probs"

2.3 optim:数值优化(MLE、自定义 loss)

📌 Lecture 1d block 1.pdf p.34、Lecture 2d block 1.pdf p.32–33;📝 Tut1 Prob. Ex11、Tut2 Ex10

df=data.frame(x1=1,x2=2)
mylikelihood<-function(x){            # 参数打包成一个向量 x
  x1=x[1]; x2=x[2]
  return((x1-df$x1)^2+(x2-df$x2)^2)
}
res=optim(c(0,0), fn=mylikelihood, method="BFGS")
res$par; res$value; res$counts; res$convergence   # convergence 为 0 表示收敛
Fs=list(); Params=list(); k=0
myf<- function(x){
  f=(x[1]-2)^4+(x[2]-4)^4
  .GlobalEnv$k= .GlobalEnv$k+1
  .GlobalEnv$Fs[[k]]=f
  .GlobalEnv$Params[[k]]=x
  return(f)
}
myGrad <-function(x) c(4*(x[1]-2)^3, 4*(x[2]-4)^3)
res<-optim(c(0,0), fn=myf, gr=myGrad, method="BFGS")
plot(log(as.numeric(Fs)), type="l", main="Function iterations")

2.4 kknn:k-NN

slides 只讲 k-NN 的原理 📌 Lecture 1a block 1.pdf p.15–20,R 用法来自 📝 Tut1 Prob. Ex10

library(kknn)
m=kknn(as.factor(y)~., train=train, test=test, k=10, kernel="rectangular")
pred=m$fitted.values          # 预测的类
prob=m$prob                   # 每个类的概率(n_test × 类数)
table(test$y, pred)

2.5 cvTools:K-fold CV 选模型

📌 Lecture 2a block 1.pdf p.34

library(cvTools)
fit1=lm(V9~V3+V4+V5+V6+V7+V8, data=data)
f1=cvFit(fit1, y=data$V9, data=data, K=10, foldType="consecutive")
# f2、f3 类似
res=cvSelect(f1,f2,f3); plot(res)

2.6 tree:决策树和 pruning

📌 Lecture 2b block 1.pdf p.23–28;📝 Tut2 Ex3–6

library(tree)
fit=tree(class~., data=train)        # 分类树要求 class 是 factor
plot(fit); text(fit, pretty=0)
fit; summary(fit)                    # 叶子数、用到的变量、misclass rate
Yfit=predict(fit, newdata=valid, type="class")
table(valid$class,Yfit)
set.seed(12345)
cv.res=cv.tree(fit)
plot(cv.res$size, cv.res$dev, type="b", col="red")
best=cv.res$size[which.min(cv.res$dev)]       # 📝 Tut2 Ex6
trainScore=rep(0,9); testScore=rep(0,9)
for(i in 2:9) {
  prunedTree=prune.tree(fit,best=i)
  pred=predict(prunedTree, newdata=valid, type="tree")
  trainScore[i]=deviance(prunedTree)
  testScore[i]=deviance(pred)
}
plot(2:9, trainScore[2:9], type="b", col="red", ylim=c(0,250))
points(2:9, testScore[2:9], type="b", col="blue")
finalTree=prune.tree(fit, best=5)

2.7 prcomp / princomp:PCA

📌 Lecture 2c block 1.pdf p.22–24;📝 Tut2 Ex7

data1=mydata; data1$Fat=c()          # 去掉 response 列
res=prcomp(data1)                    # 默认 center=TRUE, scale.=FALSE
lambda=res$sdev^2                    # eigenvalues
sprintf("%2.3f",lambda/sum(lambda)*100)   # 每个 PC 解释的方差(%)
cumsum(lambda)/sum(lambda)           # 累计比例,用来决定要几个 PC
screeplot(res); biplot(res)
U=res$rotation                       # loadings(p×p,每列是一个 PC)
plot(res$x[,1], res$x[,2])           # scores:数据在 PC1、PC2 上的坐标
plot(U[,1], main="Traceplot, PC1")   # 哪些原始变量对 PC1 贡献大

2.8 glmnet / cv.glmnet:ridge 和 LASSO

📌 Lecture 2d block 1.pdf p.17–22;📝 Tut2 Ex8–9

library(glmnet)
x=as.matrix(train[,1:6]); y=train[,7]
model0=glmnet(x, y, alpha=0, family="gaussian")   # alpha=0:ridge;alpha=1:LASSO
plot(model0, xvar="lambda", label=TRUE)            # 系数路径
set.seed(12345)
model=cv.glmnet(x, y, alpha=1, family="gaussian")
model$lambda.min; plot(model)
coef(model, s="lambda.min")
ynew=predict(model, newx=as.matrix(test[,1:6]), s="lambda.min", type="response")

3. ⚠️ slides 和公开 tutorials 都没有给 R 代码的部分

Topic 3 的 3a–3d slides(kernel、SVM、NN)里完全没有 R 代码,2c 讲 ICA 也没有给代码 📌 Lecture 2c block 1.pdf p.26–28。下面是这些包的标准写法,lab 真正要求用哪个包、哪些参数,以 lab 说明为准。

3.1 kernel 方法手写(3a)

📌 Lecture3aBlock12021.pdf p.19–26,slides 9–10/15

gauss=function(u) exp(-u^2)                         # 也可以换成别的 kernel
kreg=function(x0, x, y, h) {                        # Nadaraya–Watson(1 维)
  w=gauss((x-x0)/h); sum(w*y)/sum(w)
}
yhat=sapply(xgrid, kreg, x=train$x, y=train$y, h=0.5)
K=exp(-as.matrix(dist(X))^2/(2*s^2))                # Gaussian Gram matrix

3.2 kernlab::ksvm:SVM 和 SVR(3b)

library(kernlab)
m=ksvm(y~., data=train, type="C-svc", kernel="rbfdot", kpar=list(sigma=0.05), C=1, scaled=TRUE)
pred=predict(m, newdata=test)         # 分类结果
m@nSV; alphaindex(m)                  # support vector 数量和下标
r=ksvm(y~., data=train, type="eps-svr", epsilon=0.1, C=1)   # SVR

3.3 neuralnet:MLP(3c)

library(neuralnet)
set.seed(12345)                                    # 初始权重是随机的
nn=neuralnet(y~x1+x2, data=train, hidden=c(10), act.fct="logistic", linear.output=TRUE)
plot(nn); pred=predict(nn, newdata=test)           # 也可以用 compute(nn, test)$net.result

3.4 fastICA:ICA(2c)

library(fastICA)
set.seed(12345)                        # 初始化 W 用了随机数
ica=fastICA(X, n.comp=2)               # 默认 fun="logcosh"
ica$S                                  # 估计出的独立成分
ica$A; ica$W; ica$K                    # mixing、unmixing、pre-whitening 矩阵

4. 通用 R 基础(lab 常用)

4.1 帮助、赋值、向量

📌 Lecture 1c block 1.pdf p.5–9

?lm; args(glm); example(sample)   # 查帮助
a<-3; a=3                         # 赋值:<- 和 = 都可以
x=c(1,3); y=numeric(10); s=seq(0,1,by=0.1); 1:10
length(x); sum(x); which.max(x); order(x); rev(sort(x))

4.2 matrix 和线性代数

📌 Lecture 1c block 1.pdf p.10–15

A=matrix(1:6, nrow=2)          # 按列填充;要按行填就加 byrow=TRUE
t(A); A%*%B; solve(A); solve(A,b); diag(A); crossprod(X)  # crossprod(X) = t(X)%*%X
dim(A); nrow(A); ncol(A); colMeans(A); rowSums(A)
cbind(1, X)                    # 加一列 intercept

4.3 data.frame、索引、factor

📌 Lecture 1c block 1.pdf p.17–22;📝 Tut1 Basic manipulation Ex1–9

df=data.frame(X=c(1,2), Y=c("M","F"))
df$Y; df[ ,"Y"]; df[1, ]; df[df$X>1 & df$Y=="M", 2:3]
df$new=log(df$X); df$X=c()                  # 新增一列 / 删除一列
colnames(df)[1]="ID"; str(df); summary(df); head(df)
df$Y=as.factor(df$Y); levels(df$Y)
as.numeric(as.character(f))                  # factor → 数字,必须先转 character
X=as.matrix(df[, -7])                        # 去掉第 7 列,再转成 matrix

4.4 读写 CSV

📌 Lecture 1c block 1.pdf p.21;📝 Tut1 Data Ex1–4

d=read.csv("file.csv")                        # 逗号分隔,小数点用 .
d=read.csv2("file.csv")                       # 分号分隔,小数点用 ,(瑞典 Excel 常见)
d=read.csv("machine.csv", header=FALSE)       # 没有表头时,列名是 V1, V2, ...  📌 <span class="cite">Lecture 2a block 1.pdf p.34</span>
library(readxl); d=read_excel("tecator.xls")  # 读 Excel
write.csv(d, "out.csv", row.names=FALSE)

4.5 apply 家族、循环、函数

📌 Lecture 1c block 1.pdf p.15、Lecture 1c block 1.pdf p.23–27;📝 Tut1 Ex7、Ex10

apply(M, 1, function(r) sum(r^2))   # 1 = 按行,2 = 按列
sapply(1:30, function(k) err(k))    # 返回 vector
lapply(lst, f)                      # 返回 list
for (i in 1:10) { ... }; while (cond) { ... }
if (x==3) { ... } else { ... }
f=function(a, b=2){ a+b }           # 最后一个表达式的值就是返回值

4.6 画图

📌 Lecture 1c block 1.pdf p.28–30

plot(x, y, type="p", col="blue", main="title", xlab="x", ylab="y", ylim=c(0,1))
points(x, y2, col="red"); lines(x, fit, lty="dotted")   # 往已有的图上加
hist(x); barplot(v, names.arg=nm, horiz=TRUE, las=1)
legend("topright", legend=c("train","valid"), col=c("red","blue"), lty=1)
par(mfrow=c(1,2))                                       # 一页并排放两张图

4.7 随机数和分布

📌 Lecture 1c block 1.pdf p.25;📝 Tut1 Prob. Ex1–4

rnorm(5, mean=5, sd=0.1); runif(3); sample(n, 5, replace=FALSE)
dnorm(0); pnorm(1.96); qnorm(0.975)   # d = 密度, p = CDF, q = 分位数, r = 抽样

4.8 dplyr(1c 推荐学)

📌 Lecture 1c block 1.pdf p.32;📝 Tut1 dplyr Ex1–9

library(dplyr)
d %>% select(X2002:X2020) %>% filter(sex=="boys") %>%
  mutate(r=X2020/X2002) %>% group_by(region) %>% summarise(m=mean(r)) %>% arrange(m)

5. 交 lab 前的自查