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

在dplyr/broom中创建模型并扩充数据时保留额外列的方法

保留sample_id的线性拟合方案

嘿,这个问题我太熟悉了!很多人在做拟合的时候容易不小心把标识列丢掉,其实只要稍微调整一下处理逻辑,就能轻松保留sample_id。下面给你两种常用的实现方式,基于Python的pandas和主流统计/机器学习库,你可以按需选择:

方法一:用statsmodels(适合需要统计指标的场景)

如果你需要查看模型的R²、p值这类统计信息,statsmodels是绝佳选择。关键是始终保留原DataFrame的引用,不要单独拆分数据后就丢掉包含sample_id的原表:

import pandas as pd
import statsmodels.api as sm

# 模拟你的数据集(实际替换成你自己的DataFrame即可)
data = {
    'sample_id': ['S001', 'S002', 'S003', 'S004', 'S005'],
    'observation': [2.1, 3.5, 1.8, 4.2, 5.0],
    'estimate': [2.0, 3.7, 1.9, 4.0, 5.2]
}
df = pd.DataFrame(data)

# 准备模型变量:给自变量加上截距项
X = sm.add_constant(df['estimate'])
y = df['observation']

# 拟合线性模型
model = sm.OLS(y, X).fit()

# 直接把拟合值添加到原DataFrame里,sample_id完全保留
df['fitted_values'] = model.predict(X)

# 查看结果:所有列都在
print(df)

方法二:用scikit-learn(适合机器学习流水线场景)

如果你的工作流更偏向机器学习,scikit-learn的线性回归接口更简洁,同样能轻松保留sample_id:

import pandas as pd
from sklearn.linear_model import LinearRegression

df = pd.DataFrame(data)  # 复用上面的模拟数据

# 初始化并拟合模型
lr_model = LinearRegression()
lr_model.fit(df[['estimate']], df['observation'])

# 计算拟合值并追加到原表
df['fitted_values'] = lr_model.predict(df[['estimate']])

# 检查结果,sample_id稳稳在列
print(df)

特殊场景:按sample_id分组拟合

如果你的数据集是每个sample_id对应一组观测值(比如一个样本有多行数据),可以用groupby来分组拟合,同样不会丢失标识列:

def fit_single_group(group):
    # 对每个分组单独拟合模型
    X = sm.add_constant(group['estimate'])
    y = group['observation']
    model = sm.OLS(y, X).fit()
    group['fitted_values'] = model.predict(X)
    return group

# 按sample_id分组拟合后合并结果
df_grouped = df.groupby('sample_id').apply(fit_single_group).reset_index(drop=True)

核心思路总结

不管用哪种方法,核心都是不要在处理过程中丢弃包含sample_id的原数据集——要么直接在原DataFrame上添加新列,要么拟合后将预测结果与原表(带sample_id)合并,这样就绝对不会丢失你的标识列了。

内容的提问来源于stack exchange,提问作者slhck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:02:50