You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历能耗数据变量时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:57:12