OLS回归结果存储排序报错:float()参数不能为Cell类型
问题:OLS回归结果转DataFrame时Cell类型转换错误
我尝试将OLS回归输出中的R-squared值和P-values存入DataFrame rankedvariableslist,并按P-values升序、R-squared值降序排序,但运行时出现错误:
float() argument must be a string or a number, not 'Cell'
推测原因是获取到的R-squared值和P-values为Cell类型,无法直接转换为float/int类型。
原代码示例
correspondantsleepvariable = [] correspondantpvalue = [] correspondantpvalue = [] newerresults = resultmodeldistancevariation2sleepsummary.tables[0] newerdata = pd.DataFrame(newerresults) rsquaredvalue = newerdata.iloc[0,3] rsquaredvalues.append(rsquaredvalue) modelpvalues = resultmodeldistancevariation2sleepsummary.tables[1] newerdatavalues = pd.DataFrame(modelpvalues) pvalue = newerdatavalues.iloc[12,4] correspondantpvalue.append(pvalue) correspondantsleepvariable.append(sleepvariable[i]) rankedvariableslist = pd.DataFrame({'Sleepvariables':correspondantsleepvariable, 'R-squared value':rsquaredvalues,'P-value':correspondantpvalue}) listed = list(range(0, 21)) listed = pd.DataFrame(listed) rankedvariableslist = pd.concat((rankedvariableslist,listed),axis=1) rankedvariableslist = rankedvariableslist.rename(columns={0: "Value"}) rankedvariableslist['R-squared value'] = rankedvariableslist['R-squared value'].astype('category').cat.as_ordered() rankedvariableslist['P-value'] = rankedvariableslist['P-value'].astype('category').cat.as_ordered() rankedvariableslist['Sleepvariables'] = rankedvariableslist['Sleepvariables'].astype('category').cat.as_ordered() rankedvariableslist.sort_values(['P-value','R-squared value'],ascending = [True, False]) print(rankedvariableslist.head(3))
回归摘要示例(newerresults)
OLS Regression Results ============================================================================== Dep. Variable: distance R-squared: 0.028 Model: OLS Adj. R-squared: 0.016 Method: Least Squares F-statistic: 2.338 Date: Fri, 18 Nov 2022 Prob (F-statistic): 0.00773 Time: 12:39:29 Log-Likelihood: -1274.1 No. Observations: 907 AIC: 2572. Df Residuals: 895 BIC: 2630. Df Model: 11 Covariance Type: nonrobust ==============================================================================
问题原因
statsmodels的回归摘要表格(summary().tables)中的每个单元格是Cell对象,不是直接的数值或字符串。直接将表格转DataFrame后提取的元素是Cell实例,无法直接转换为数值类型,因此报错。
解决方案
有两种可靠的处理方式:
方式1:直接从回归结果对象提取属性(推荐)
statsmodels的OLS结果对象本身提供了直接获取统计量的属性,不需要从摘要表格中提取,避免Cell类型问题:
- R-squared值:
resultmodeldistancevariation2sleep.rsquared(直接返回float) - 整体模型P值(Prob(F-statistic)):
resultmodeldistancevariation2sleep.f_pvalue(直接返回float) - 单个变量的P值:
resultmodeldistancevariation2sleep.pvalues[变量名](返回对应变量的float类型P值)
方式2:从Cell对象中提取原始值
如果必须从摘要表格中提取,需要访问Cell对象的data属性获取原始字符串,再转换为float:
# 提取R-squared rsquaredvalue = float(newerdata.iloc[0,3].data) # 提取P值 pvalue = float(newerdatavalues.iloc[12,4].data)
修改后的代码示例(方式1)
correspondantsleepvariable = [] rsquaredvalues = [] # 修正原代码重复定义correspondantpvalue的问题 correspondantpvalue = [] # 假设resultmodeldistancevariation2sleep是你的OLS回归结果对象 for i in range(len(sleepvariable)): # 替换为你实际训练模型的代码,比如针对每个sleepvariable训练模型 # model = sm.OLS(y, X) # resultmodeldistancevariation2sleep = model.fit() # 直接从结果对象提取R-squared和P值 rsquared_val = resultmodeldistancevariation2sleep.rsquared # 若需单个变量P值,替换为:resultmodeldistancevariation2sleep.pvalues[sleepvariable[i]] p_val = resultmodeldistancevariation2sleep.f_pvalue rsquaredvalues.append(rsquared_val) correspondantpvalue.append(p_val) correspondantsleepvariable.append(sleepvariable[i]) # 构建DataFrame rankedvariableslist = pd.DataFrame({ 'Sleepvariables': correspondantsleepvariable, 'R-squared value': rsquaredvalues, 'P-value': correspondantpvalue }) # 添加Value列(保留原代码逻辑) rankedvariableslist['Value'] = range(0, len(rankedvariableslist)) # 直接排序(数值类型无需转category) rankedvariableslist = rankedvariableslist.sort_values( ['P-value', 'R-squared value'], ascending=[True, False] ) print(rankedvariableslist.head(3))
内容的提问来源于stack exchange,提问作者Caledonian26
相关产品推荐
相关产品推荐

