我正在使用MATLAB进行逻辑回归,以解决一个简单的分类问题.我的协变量是一个介于0和1之间的连续变量,而我的分类响应是0(不正确)或1(正确)的二进制变量.
我正在寻找逻辑回归来建立预测器,该预测器将输出某些输入观察的概率(例如,如上所述的连续变量)是正确的或不正确的.虽然这是一个相当简单的场景,但我在MATLAB中运行它时遇到了一些麻烦.
我的方法如下:我有一个列向量X包含连续变量的值,另一个同等大小的列向量Y包含每个值的已知分类X(例如0或1).我正在使用以下代码:
[b,dev,stats] = glmfit(X,Y,'binomial','link','logit');
然而,这给了我无意义的结果,其中p = 1.000,系数(b)非常高(-650.5,1320.1),并且相关的标准误差值大约为1e6.
然后我尝试使用其他参数来指定二项式样本的大小:
glm = GeneralizedLinearModel.fit(X,Y,'distr','binomial','BinomialSize',size(Y,1));
这给了我更符合我的预期的结果.我提取了系数,用于glmval创建estimate(Y_fit = glmval(b,[0:0.01:1],'logit');),并为fitting(X_fit = linspace(0,1))创建了一个数组.当我使用原始数据和模型的图重叠时,模型figure, plot(X,Y,'o',X_fit,Y_fit'-')的结果图基本上看起来像'S'形图的下1/4,这是典型的逻辑回归图.
我的问题如下:
1)为什么我的使用glmfit给出了奇怪的结果?
2)我应该如何解决我的初始问题:给定一些输入值,它的分类是正确的概率是多少?
3)如何获得模型参数的置信区间?glmval应该能够输入stats输出glmfit,但我的使用glmfit并没有给出正确的结果.
任何评论和意见都非常有用,谢谢!
我发现mnrval似乎给出了合理的结果.我可以用[b_fit,dev,stats] = mnrfit(X,Y+1);这里Y+1只是让我的二元分类为标称之一.
我可以遍历[pihat,lower,upper] = mnrval(b_fit,loopVal(ii),stats);以获得各种pihat概率值,其中loopVal = linspace(0,1)或某些适当的输入范围和"ii = 1:length(loopVal)".
该stats参数具有很大的相关系数(0.9973),但p值为b_fit0.0847和0.0845,我不太清楚如何解释.有什么想法吗?另外,为什么会 …
matlab classification probability confidence-interval logistic-regression
我正在使用statsmodels.tsa.SARIMAX()来训练具有外生变量的模型.当使用外生变量训练模型时,是否存在等效的get_prediction(),以便返回的对象包含预测的平均值和置信区间而不仅仅是一组预测的平均值结果?predict()和forecast()方法采用外生变量,但只返回预测的平均值.
SARIMA_model = sm.tsa.SARIMAX(endog=y_train.astype('float64'),
exog=ExogenousFeature_train.values.astype('float64'),
order=(1,0,0),
seasonal_order=(2,1,0,7),
simple_differencing=False)
model_results = SARIMA_model.fit()
pred = model_results.predict(start=train_end_date,
end=test_end_date,
exog=ExogenousFeature_test.values.astype('float64').reshape(343,1),
dynamic=False)
Run Code Online (Sandbox Code Playgroud)
这里的pred是一个预测值数组,而不是一个包含预测平均值和置信区间的对象,如果你运行get_predict(),你会得到它们.注意,get_predict()不接受外生变量.
我的statsmodels版本是0.8
python time-series confidence-interval forecasting statsmodels
这是代码:
fig=plt.figure(figsize=(14,8))
sns.lineplot(x='season', y='team_strikerate', hue='batting_team', data=overall_batseason)
plt.legend(title = 'Teams', loc = 1, fontsize = 12)
plt.xlim([2008,2022])
Run Code Online (Sandbox Code Playgroud)
只是为了让您知道,我已经在此之上绘制了另一个类似的线图。
所以我有一个三列数据框,有Trials,Ind.Variable,Observation.就像是:
df1<- data.frame(Trial=rep(1:10,5), Variable=rep(1:5, each=10), Observation=rnorm(1:50))
我试图绘制一个95%的conf.每个试验的平均值间隔使用相当低效的方法如下:
b<-NULL
b$mean<- aggregate(Observation~Variable, data=df1,mean)[,2]
b$sd <- aggregate(Observation~Variable, data=df1,sd)[,2]
b$Variable<- df1$Variable
b$Observation <- df1$Observation
b$ucl <- rep(qnorm(.975, mean=b$mean, sd=b$sd), each=10)
b$lcl <- rep(qnorm(.025, mean=b$mean, sd=b$sd), each=10)
b<- as.data.frame(b)
c <- ggplot(b, aes(Variable, Observation))
c + geom_point(color="red") +
geom_smooth(aes(ymin = lcl, ymax = ucl), data=b, stat="summary", fun.y="mean")
Run Code Online (Sandbox Code Playgroud)
这是低效的,因为它复制了ymin,ymax的值.我已经看过geom_ribbon方法,但我仍然需要复制.但是,如果我使用像glm这样的任何平滑,代码更简单,没有重复.有没有更好的方法呢?
参考文献:1.R用ggplot绘制置信区间 2. 用ggplot2手动着色置信区间 3. http://docs.ggplot2.org/current/geom_smooth.html
我想在数据线的上方和下方有95%的置信区间线 - 而不是每个点的垂直条.
有没有办法我可以在gnuplot中这样做而不绘制另一条线?或者我是否需要绘制另一条线然后适当地标记它?
我正在尝试计算大型数据集中“力”列的均值和置信区间(95%)。我需要通过对不同的“类”进行分组来使用 groupby 函数的结果。
当我计算平均值并将其放入新数据框中时,它为我提供了所有行的 NaN 值。我不确定我是否走正确的路。有没有更简单的方法来做到这一点?
这是示例数据框:
df=pd.DataFrame({ 'Class': ['A1','A1','A1','A2','A3','A3'],
'Force': [50,150,100,120,140,160] },
columns=['Class', 'Force'])
Run Code Online (Sandbox Code Playgroud)
为了计算置信区间,我做的第一步是计算平均值。这是我使用的:
F1_Mean = df.groupby(['Class'])['Force'].mean()
Run Code Online (Sandbox Code Playgroud)
这给了我NaN所有行的值。
我试图mle2在包中使用该命令bbmle.我正在研究bbmleBolker 的"最大似然估计和包装分析"的第2页.不知何故,我无法输入正确的起始值.这是可重现的代码:
l.lik.probit <-function(par, ivs, dv){
Y <- as.matrix(dv)
X <- as.matrix(ivs)
K <-ncol(X)
b <- as.matrix(par[1:K])
phi <- pnorm(X %*% b)
sum(Y * log(phi) + (1 - Y) * log(1 - phi))
}
n=200
set.seed(1000)
x1 <- rnorm(n)
x2 <- rnorm(n)
x3 <- rnorm(n)
x4 <- rnorm(n)
latentz<- 1 + 2.0 * x1 + 3.0 * x2 + 5.0 * x3 + 8.0 * x4 + rnorm(n,0,5)
y <- latentz
y[latentz < 1] …Run Code Online (Sandbox Code Playgroud) 我需要绘制几个定义为的数据点
c(x,y,stdev_x,stdev_y)
作为具有95%置信限的表示的散点图,示例显示了点和围绕它的一个轮廓.理想情况下,我想在点周围绘制椭圆形,但不知道该怎么做.我正在考虑构建样本并绘制它们,添加stat_density2d()但是需要将轮廓数量限制为1,并且无法弄清楚如何去做.
require(ggplot2)
n=10000
d <- data.frame(id=rep("A", n),
se=rnorm(n, 0.18,0.02),
sp=rnorm(n, 0.79,0.06) )
g <- ggplot (d, aes(se,sp)) +
scale_x_continuous(limits=c(0,1))+
scale_y_continuous(limits=c(0,1)) +
theme(aspect.ratio=0.6)
g + geom_point(alpha=I(1/50)) +
stat_density2d()
Run Code Online (Sandbox Code Playgroud) 我想获得分位数回归的回归系数的95%置信区间.您可以使用R中包的rq功能quantreg(与OLS模型相比)计算分位数回归:
library(quantreg)
LM<-lm(mpg~disp, data = mtcars)
QR<-rq(mpg~disp, data = mtcars, tau=0.5)
Run Code Online (Sandbox Code Playgroud)
我可以使用confint函数获得线性模型的95%置信区间:
confint(LM)
Run Code Online (Sandbox Code Playgroud)
当我使用分位数回归时,我理解以下代码会产生引导标准错误:
summary.rq(QR,se="boot")
Run Code Online (Sandbox Code Playgroud)
但实际上我想要95%的置信区间.也就是说,有些东西可以解释为:"概率为95%,间隔[...]包括真实系数".当我使用summary.lm()计算标准误差时,我只需乘以SE*1.96并得到与confint()类似的结果.但是使用自举标准错误是不可能的.所以我的问题是如何获得分位数回归系数的95%置信区间?
我用来sns.lineplot在图中显示置信区间。
sns.lineplot(x = threshold, y = mrl_array, err_style = 'band', ci=95)
plt.show()
Run Code Online (Sandbox Code Playgroud)
我得到以下图,它不显示置信区间:
有什么问题?
python ×4
r ×4
ggplot2 ×2
seaborn ×2
errorbar ×1
forecasting ×1
formatting ×1
gnuplot ×1
matlab ×1
pandas ×1
probability ×1
python-3.x ×1
quantreg ×1
scatter-plot ×1
statsmodels ×1
time-series ×1