在R中将三维数组转换为函数型数据时遇维度不兼容错误求助
解决Data2fd中argvals与y维度不兼容的错误
错误原因
你遇到的错误是因为Data2fd的argvals参数传入了单个值1140,但y = sst2[i,j,]是长度为1140的向量。这个函数要求argvals的长度必须和每个y观测的长度完全匹配——每个y的元素都需要对应一个自变量(时间点)值,而不是只传一个总长度。
修正方案
- 修正argvals参数:把
argvals = 1140改成argvals = 1:1140,这样自变量序列的长度和y一致,每个数据点对应一个时间点。 - 优化结果存储:原代码里每次循环都会覆盖
tmpfdd,最后只能得到最后一组(i=128,j=64)的结果。建议用列表或矩阵式列表存储所有函数型数据对象。
修正后的代码
用列表存储所有结果
# 初始化列表,容量等于数组的前两维乘积 fdd_list <- vector("list", length = dim(sst2)[1] * dim(sst2)[2]) current_index <- 1 for (i in 1:dim(sst2)[1]) { for (j in 1:dim(sst2)[2]) { tmpfdd <- Data2fd( argvals = 1:1140, # 匹配y长度的自变量序列 y = sst2[i, j, ], basisobj = create.fourier.basis(nbasis = 15) ) fdd_list[[current_index]] <- tmpfdd current_index <- current_index + 1 } }
用矩阵式列表保留二维结构
如果想保留原数组的128×64二维索引结构,可以用矩阵存储列表元素:
# 创建128行64列的矩阵,每个元素是列表 fdd_matrix <- matrix(vector("list", dim(sst2)[1]*dim(sst2)[2]), nrow = dim(sst2)[1], ncol = dim(sst2)[2]) for (i in 1:dim(sst2)[1]) { for (j in 1:dim(sst2)[2]) { fdd_matrix[[i,j]] <- Data2fd( argvals = 1:1140, y = sst2[i, j, ], basisobj = create.fourier.basis(nbasis = 15) ) } }
补充说明
如果你的数据对应的自变量不是从1到1140的整数(比如实际的日期序列),只需要把argvals替换成对应的长度为1140的序列即可,核心是保证argvals和y的长度一致。
内容的提问来源于stack exchange,提问作者Idris SI AHMED
相关产品推荐
相关产品推荐

