在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
相关产品推荐
相关产品推荐

