遍历能耗数据变量时,lm对象列表传入segmented函数报无效类型错误
问题:批量处理lm对象时segmented函数报错
我正在分析多栋建筑5年的小时级能耗数据,目标是基于建筑温度建立电力消耗模型,找出每栋建筑启动电力制冷的温度拐点。数据样例如下:
head(test1)
Date Hour Temp Bldg1_elect Bldg2_elect Bldg3_elect Bldg4_elect Bldg5_elect 1 1/1/2017 0 39.00000 190 173.167 245.50 239.0 335.700 2 1/1/2017 1 37.50000 188 172.880 245.25 241.0 333.600 3 1/1/2017 2 34.00000 186 172.703 244.75 238.5 340.900 4 1/1/2017 3 33.00000 187 172.777 248.25 242.5 334.638 5 1/1/2017 4 30.33333 187 173.112 253.00 254.5 338.362 6 1/1/2017 5 31.00000 190 176.044 253.75 283.5 335.263
我尝试用以下R代码批量处理:
library(segmented) # 创建每个建筑的lm模型列表 Elect_model <- lapply(3:8, function(x) lm(test1[, x] ~ Temp, data = test1)) # 用segmented找温度拐点 Elect_cp <- lapply(1:5, function(x) segmented(Elect_model[[x]], seg.Z = ~Temp))
但运行后报错:
Error in model.frame.default(formula = test1[, x] ~ Temp + test1, data = test1, : invalid type (list) for variable 'test1'
已知segmented函数可接收lm对象作为参数,请问是不能用这种方式循环处理lm对象列表吗?
解决方法
问题根源在于创建lm模型时的公式写法:lm(test1[, x] ~ Temp, data = test1)。直接在公式中使用test1[,x]会让lm模型保留对数据集对象的直接引用,而非从data参数指定的数据集里提取变量名。后续segmented函数解析该lm对象时,会错误地将test1识别为公式中的变量(而非数据集),而此时test1在环境中被判定为列表类型,从而触发报错。
修正后的代码
通过动态生成包含变量名的公式,避免直接引用数据集列:
library(segmented) # 提取所有建筑电力消耗的列名 bldg_cols <- names(test1)[4:8] # 批量创建lm模型 Elect_model <- lapply(bldg_cols, function(col) { # 动态生成公式字符串并转为公式对象 model_formula <- as.formula(paste(col, "~ Temp")) lm(formula = model_formula, data = test1) }) # 批量处理segmented找拐点 Elect_cp <- lapply(Elect_model, function(model) { segmented(model, seg.Z = ~Temp) })
额外说明
- 原代码中
lapply(3:8, ...)的索引错误:数据集第3列是Temp,建筑电力数据在第4到8列,因此应迭代4:8或直接提取列名,避免索引偏差。 - 用变量名构建公式后,lm模型的公式会明确为
BldgX_elect ~ Temp,segmented函数可正确从test1中提取变量,不会出现类型错误。
内容的提问来源于stack exchange,提问作者PAR5102
相关产品推荐
相关产品推荐

