有没有办法做到这一点?我似乎不能轻易地将pandas系列与绘制CDF联系起来.
我正在尝试将伽玛分布拟合到我的数据点,我可以使用下面的代码来实现.
import scipy.stats as ss
import numpy as np
dataPoints = np.arange(0,1000,0.2)
fit_alpha,fit_loc,fit_beta = ss.rv_continuous.fit(ss.gamma, dataPoints, floc=0)
Run Code Online (Sandbox Code Playgroud)
我想使用许多这样的小伽马分布来重建更大的分布(较大的分布与问题无关,只能证明我为什么要尝试拟合cdf而不是pdf).
为了实现这一点,我希望将累积分布(而不是pdf)与我的较小分布数据相匹配.- 更确切地说,我想将数据仅适用于累积分布的一部分.
例如,我只想拟合数据,直到累积概率函数(具有一定的比例和形状)达到0.6.
fit()为此目的使用的任何想法?
我正在尝试使用R和ggplot2绘制分发CDF.但是,在我转换Y轴以获得直线后,我发现在绘制CDF函数时遇到困难.这种情节经常在Gumbel纸质图中使用,但在这里我将使用正态分布作为例子.
我生成数据,并绘制数据的累积密度函数和函数.他们很合适.但是,当我应用Y轴变换时,它们不再适合.
sim <- rnorm(100) #Simulate some data
sim <- sort(sim) #Sort it
cdf <- seq(0,1,length.out=length(sim)) #Compute data CDF
df <- data.frame(x=sim, y=cdf) #Build data.frame
library(scales)
library(ggplot2)
#Now plot!
gg <- ggplot(df, aes(x=x, y=y)) +
geom_point() +
stat_function(fun = pnorm, colour="red")
gg
Run Code Online (Sandbox Code Playgroud)
现在我尝试根据使用的分布变换Y轴.
#Apply transformation
gg + scale_y_continuous(trans=probability_trans("norm"))
Run Code Online (Sandbox Code Playgroud)
点被正确转换(它们位于一条直线上),但功能不是!
但是,如果我这样做,一切似乎都能正常工作,用ggplot计算CDF:
ggplot(data.frame(x=sim), aes(x=x)) +
stat_ecdf(geom = "point") +
stat_function(fun="pnorm", colour="red") +
scale_y_continuous(trans=probability_trans("norm"))
Run Code Online (Sandbox Code Playgroud)
为什么会这样?为什么不手动计算CDF使用比例变换?
我有一个包含记录事件的文件.每个条目都有时间和延迟.我有兴趣绘制延迟的累积分布函数.我对尾部延迟最感兴趣所以我希望绘图具有对数y轴.我对以下百分位数的延迟感兴趣:第90,99,99.9,99.99和99.999.到目前为止,这是我的代码生成一个常规的CDF图:
# retrieve event times and latencies from the file
times, latencies = read_in_data_from_file('myfile.csv')
# compute the CDF
cdfx = numpy.sort(latencies)
cdfy = numpy.linspace(1 / len(latencies), 1.0, len(latencies))
# plot the CDF
plt.plot(cdfx, cdfy)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我知道我希望情节看起来像什么,但我很难得到它.我希望它看起来像这样(我没有生成这个情节):

使x轴对数很简单.y轴是给我带来问题的那个.使用set_yscale('log')不起作用,因为它想要使用10的幂.我真的希望y轴具有与该图相同的刻度标签.
如何将我的数据放入像这样的对数图中?
编辑:
如果我将yscale设置为'log',并将ylim设置为[0.1,1],我会得到以下图:

问题是数据集上从0到1的典型对数刻度图将集中在接近零的值上.相反,我想专注于接近1的值.
为了计算多元法线的CDF,我按照这个例子(对于单变量情况)但不能解释scipy产生的输出:
from scipy.stats import norm
import numpy as np
mean = np.array([1,5])
covariance = np.matrix([[1, 0.3 ],[0.3, 1]])
distribution = norm(loc=mean,scale = covariance)
print distribution.cdf(np.array([2,4]))
Run Code Online (Sandbox Code Playgroud)
产生的输出是:
[[ 8.41344746e-01 4.29060333e-04]
[ 9.99570940e-01 1.58655254e-01]]
Run Code Online (Sandbox Code Playgroud)
如果联合CDF定义为:
P (X1 ? x1, . . . ,Xn ? xn)
Run Code Online (Sandbox Code Playgroud)
那么预期的输出应该是0到1之间的实数.
考虑从(-inf,inf)到[0,1] 的非递减主观(上)函数的集合.(典型的CDF满足该属性.)换句话说,对于任何实数x,0 <= f(x)<= 1. 逻辑函数可能是最着名的例子.
我们现在以x值列表的形式给出一些约束,并且对于每个x值,给出一对函数必须介于其间的y值.我们可以将其表示为{x,ymin,ymax}三元组列表,例如
constraints = {{0, 0, 0}, {1, 0.00311936, 0.00416369}, {2, 0.0847077, 0.109064},
{3, 0.272142, 0.354692}, {4, 0.53198, 0.646113}, {5, 0.623413, 0.743102},
{6, 0.744714, 0.905966}}
Run Code Online (Sandbox Code Playgroud)
图形上看起来像这样:
对cdf的约束http://yootles.com/outbox/cdffit1.png
我们现在寻求一条尊重这些约束的曲线.例如:
适合cdf http://yootles.com/outbox/cdffit2.png
让我们首先尝试通过约束的中点进行简单插值:
mids = ({#1, Mean[{#2,#3}]}&) @@@ constraints
f = Interpolation[mids, InterpolationOrder->0]
Run Code Online (Sandbox Code Playgroud)
Plotted,f看起来像这样:
插值cdf http://yootles.com/outbox/cdffit3.png
这个功能不是满足的.此外,我们希望它更顺畅.我们可以增加插值顺序,但现在它违反了其范围为[0,1]的约束:
具有更高插值顺序的插值cdf http://yootles.com/outbox/cdffit4.png
那么,目标是找到满足约束条件的最平滑的函数:
我上面绘制的第一个例子似乎是一个很好的候选者,但是我使用Mathematica的FindFit函数假设一个对数正态CDF.这在这个具体示例中效果很好,但通常不需要满足约束的对数正态CDF.
我需要在几秒钟内读取带有时间戳的长文件,以及使用numpy或scipy的CDF图.我确实试过numpy,但似乎输出不是它应该是什么.以下代码:任何建议表示赞赏.
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('Filename.txt')
sorted_data = np.sort(data)
cumulative = np.cumsum(sorted_data)
plt.plot(cumulative)
plt.show()
Run Code Online (Sandbox Code Playgroud) 我想在同一个图中绘制多个变量的 CDF 图。变量的长度不同。为了简化细节,我使用以下示例代码:
library("ggplot2")
a1 <- rnorm(1000, 0, 3)
a2 <- rnorm(1000, 1, 4)
a3 <- rnorm(800, 2, 3)
df <- data.frame(x = c(a1, a2, a3),ggg = gl(3, 1000))
ggplot(df, aes(x, colour = ggg)) + stat_ecdf()+ coord_cartesian(xlim = c(0, 3)) + scale_colour_hue(name="my legend", labels=c('AAA','BBB', 'CCC'))
Run Code Online (Sandbox Code Playgroud)
可以看到,a3的长度是800,与a1、a2不同。当我运行代码时,它显示:
> df <- data.frame(x = c(a1, a2, a3),ggg = gl(3, 1000))
Error in data.frame(x = c(a1, a2, a3), ggg = gl(3, 1000)) :
arguments imply differing number of rows: 2800, 3000
> ggplot(df, aes(x, …Run Code Online (Sandbox Code Playgroud) 我现在正在R中研究copula,不知道如何找到R中的联合累积分布?
D = c(1,3,2,2,8,2,1,3,1,1,3,3,1,1,2,1,2,1,1,3,4,1,1,3,1,1,2,1,3,7,1,4,6,1,2,1,1,3,1,2,2,3,4,1,1,1,1,2,2,12,1,1,2,1,1,1,3,4)
S = c(1.42,5.15,2.52,2.29,12.36,2.82,1.49,3.53,1.17,1.03,4.03,5.26,1.65,1.41,3.75,1.09,3.44,1.36,1.19,4.76,5.58,1.23,2.29,7.71,1.12,1.26,2.78,1.13,3.87,15.43,1.19,4.95,7.69,1.17,3.27,1.44,1.05,3.94,1.58,2.29,2.73,3.75,6.80,1.16,1.01,1.00,1.02,2.32,2.86,22.90,1.42,1.10,2.78,1.23,1.61,1.33,3.53,10.44)
Run Code Online (Sandbox Code Playgroud)
经过一番探索,我发现Gamma分布是描述上述数据的最佳方法。
library(fitdistrplus)
fg_d <- fitdist(data = Dur, distr = "gamma", method = "mle")
fg_s <- fitdist(data = Sev, distr = "gamma", method = "mle")
Run Code Online (Sandbox Code Playgroud)
然后,我尝试使用VineCopulapackge 选择copula系列:
mydata <- cbind(D=D, S=S)
u1 <- pobs(mydata[,1])
u2 <- pobs(mydata[,2])
fitCopula <- BiCopSelect(u1, u2, familyset=NA)
summary(fitCopula)
Run Code Online (Sandbox Code Playgroud)
结果表明“生存克莱顿”。然后,我尝试构建以下copula:
library(copula)
cop_model <- surClaytonCopula(param = 5.79)
Run Code Online (Sandbox Code Playgroud)
我需要找到给定D和S值的FD(d),FS(s)和C(FD(d),FS(s))。
例如,如果我们采用D = 3和S = 2,则必须找到F(D <= 3),F(S <= 2)和C(D <= 3 andS <= 2)。我想知道如何在R中使用软件包copula吗?
另外,我们如何找到C(D <= 3 …