※ 引述《tai34 (tai)》之銘言:
: 各位大大好
: 想請問 lapply fuction 是甚麼意思
: 已用 lapply 當關鍵字查詢跟查 R 內的相關說明
: 但不確定是甚麼意思
: 是利用不同的 x 運算在相同的 FUNCITON 嗎?
: 懇請白話一點,謝謝!!!
lapply 用法很多 其實可以想像成list的迴圈版本
a = lapply(1:10, function(i) i)
等同於
a = list(NULL)
for (i in 1:10)
a[[i]] = i
或是
L 是一個list
a = lapply(L, function(l) ~~some function~~)
等同於
a = list(NULL)
for (i in 1:10)
a[[i]] = some function ( L[[i]] )
我想到的簡單例子是cross-validation
X = matrix(rnorm(1000),ncol = 10) # 10 covariates
B = 1:11
Y = cbind(1,X) %*% B + rnorm(100)
dat = data.frame(X, Y)
X.i = lapply(1:nrow(X), function(i) dat[-i,])
lm.i = lapply(X.i, function(ll) lm(Y~., data = ll))
yhat.i = lapply(1:nrow(X), function(j) predict(lm.i[[j]], newdata =dat[j,]))
yhat.i = Reduce(c, yhat.i)
MSE.i = (y-yhat.i)^2
這樣的procedure可以用在選哪一個模型最佳等。
PS: 其實這個例子只是提供想法,非好的利子QQ
第二個例子(ridge regression 挑選panelty term大小):
## Data
data(longley)
X <- as.matrix(longley[,1:5])
Y <- as.matrix(longley[,7])
## Normalization
norm <- function(a) (a-mean(a))/sd(a)
Y.N <- apply(Y, 2, norm)
X.N <- apply(X, 2, norm)
D <- cbind(Y.N, X.N)
n <- nrow(X.N)
p <- ncol(X.N)
## Ridge regression, given lambda
beta.R <- function(Y, X, nc, lambda) solve(t(X)%*%X +
lambda*diag(nc),t(X)%*%Y)
## cross validation, single CPU version
m <- 1001
lambda <- seq(0, 1, length=m)
CV <- sapply(1:m, function(j){
out <- sapply(1:n, function(i)
beta.hat <- beta.R(Y.N[-i,], X.N[-i,], p, lambda[j]))
out <- mean((Y.N - diag(X.N%*%out))^2)
})
plot(lambda, CV, type='l', xlab=expression(lambda), ylab='CV')
lambda.opt <- lambda[which(CV == min(CV))]
beta.opt <- beta.R(Y.N, X.N, p, lambda.opt)
inner.loop <- function(j){
A <- apply(matrix(1:m,m,1), 1, function(i)
beta.hat <- beta.R(Y.N[-i], X.N[-i,], p, lambda[j]))
out <- mean((Y.N - diag(X.N%*%A))^2)
return(out)
}
CV <- sapply(seq(along=Y.N), inner.loop)