构建循环以使用R中数据帧的增加部分作为函数的输入

构建循环以使用R中数据帧的增加部分作为函数的输入,r,loops,dataframe,R,Loops,Dataframe,我使用PCA分析中的第一个主成分作为预测模型中的解释变量,该预测模型使用卡尔曼滤波进行递归预测。换句话说,在每个时间点,模型都会根据包含在模型中的新观测更新并生成新的预测。由于PCA使用模型中包含的所有观测数据进行计算,因此我还需要递归运行PCA,仅使用我预测的时间点之前的观测值(否则,PCA结果可能会揭示关于未来的信息,并帮助模型产生比其他方法更准确的答案)。我认为循环可能是解决方案,但我正在努力制定代码 作为一个更具体的例子,考虑一下我是否有以下数据。 data <- as.data.

我使用PCA分析中的第一个主成分作为预测模型中的解释变量,该预测模型使用卡尔曼滤波进行递归预测。换句话说,在每个时间点,模型都会根据包含在模型中的新观测更新并生成新的预测。由于PCA使用模型中包含的所有观测数据进行计算,因此我还需要递归运行PCA,仅使用我预测的时间点之前的观测值(否则,PCA结果可能会揭示关于未来的信息,并帮助模型产生比其他方法更准确的答案)。我认为循环可能是解决方案,但我正在努力制定代码

作为一个更具体的例子,考虑一下我是否有以下数据。

data <- as.data.frame(rbind(c(6,15,23),c(9,11,22), c(7,13,23), c(6,12,25),c(7,13,23)))
names(data) <- c("V1","V2","V3")

> data
  V1 V2 V3
1  6 15 23
2  9 11 22
3  7 13 23
4  6 12 25
5  7 13 23
接下来,我想用第一个、第二个和第三个观察值作为输入运行PCA

pca3 <- prcomp(data[1:3,], scale = TRUE)
pca4 <- prcomp(data[1:4,], scale = TRUE)
注释:是的,前两个值看起来有点奇怪,但请不要太注意。我的观点是,我希望构建一个数据帧,其中包含每个PCA运行的第一个主分量的最后计算值

我认为for.loop可能是这里最好的解决方案,但我没有成功地找到任何线程来引导我更接近编码解决方案。我如何使循环在计算中使用越来越多的数据帧?有人有任何建议/提示/链接吗?非常感谢您提供的任何帮助!

可以使用for循环。这可能不是最有效的解决方案,但它会起作用

首先,创建一个空列表来存储结果:

all_results <- list()
现在要提取所有结果,请使用
lappy
(列表应用)仅从每个PC1向量中提取最后一个元素:

PC1 <- lapply(all_results, function(pca) pca[length(pca)] )

PC1我有一个非常相似的方法

PCA <- vector("list", length=nrow(data)-1)
for(i in 1:(nrow(data)-1)) {
  if(i==1) j <- 1:2 else j<-i+1
  PCA[[i]] <- as.data.frame(prcomp(data[1:(1+i),], scale = TRUE)$x)[j, 1]
}

unlist(PCA)

PCA简短而高效的编码解决了问题,请注意。我接受了这一点作为我问题的答案,因为它是如此整洁且易于并入我的脚本。谢谢!这个解决方案也解决了问题,但我选择了Edward提出的解决方案,因为我有几个PCA作为解释变量,他的代码稍微快一点修改到我现有的脚本中。但是我喜欢你一步一步地解释你的编码,真的很有价值,因为我不太熟悉编码循环。谢谢!
all_results <- list()
for(i in 2:nrow(data))
{
  all_results[[i - 1]] <- as.data.frame(prcomp(data[1:i,], scale = TRUE)$x)$PC1
}
PC1 <- lapply(all_results, function(pca) pca[length(pca)] )
PC1 <- do.call("c", PC1)
PC1 <- c(all_results[[1]][1], PC1)
PCA <- vector("list", length=nrow(data)-1)
for(i in 1:(nrow(data)-1)) {
  if(i==1) j <- 1:2 else j<-i+1
  PCA[[i]] <- as.data.frame(prcomp(data[1:(1+i),], scale = TRUE)$x)[j, 1]
}

unlist(PCA)