Re: [问题] lappy function

楼主: celestialgod (天)   2013-12-12 19:37:09
※ 引述《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)
作者: tai34 (tai)   2013-02-13 01:49:00
喔喔喔! 感谢!看了你的解答跟试了很多次,大概懂他的意思了! 谢谢

Links booklink

Contact Us: admin [ a t ] ucptt.com