嗨,我正在努力从R中的函数获取CDF图.
语境:
我已经制作了一个图表并完成了节点程度分布的对数 – 对数图,这似乎遵循幂律.但我想以对数尺度做CDF作为附加措施.
到目前为止我找到的所有例子只显示了如何为数据框/表中的一列或一行做CDF,有人可以帮我吗?
所以这可以得到x或y的CDF:
x <- c(1, 2, 3, 4, 5, 6, 7, 11, 13, 14)
y <- c(48, 18, 9, 7, 5, 2, 2, 1, 1, 1)
ecdf(x)
ecdf(y)
plot(ecdf(x)) ### or same with y
但我无法获得xy数据帧或数据帧的CDF,例如:
x <- c(1, 2, 3, 4, 5, 6, 7, 11, 13, 14)
y <- c(48, 18, 9, 7, 5, 2, 2, 1, 1, 1)
dt <- data.table(x, y)
ecdf(dt) ####obviously won't work
以下是我在谷歌上发现的我想做的一个例子:
example http://igraph.org/r/doc/fit_power_law.html
请注意,不需要右上角的框,但知道如何查找alpha和p将非常有用.
谢谢您的帮助! 🙂
2018年7月1日更新
我刚才找到了解决方案,但忘记在这里添加它.正如我所说的那样,我将添加所有步骤,以验证我的数据是如何验证幂律的(来自Clauset,Shalizi和Newman的方法论(2009)经验数据中的幂律分布.SIAM评论51(4) :661-703).
首先测试幂律的拟合度:
x <- c(1, 2, 3, 4, 5, 6, 7, 11, 13, 14)
y <- c(48, 18, 9, 7, 5, 2, 2, 1, 1, 1)
logEstimate <- lm(log(y) ~ log(x))
summary(logEstimate)
然后根据预期的拟合进行绘图:
logypred <- predict(logEstimate)
d.f <- data.frame( x = x, y = y )
plot(
y ~ x,
data = d.f,
type = "n",
log = "xy",
xlab = "Degree k",
ylab = "Vertices",
xlim = c( 1, 100 ),
ylim = c( 1, 100 ) )
abline(
h = c( seq( 1, 9, 1 ), seq( 10, 90, 10 ), seq( 100, 1000, 100 ) ),
lty = 3,
col = colors()[ 440 ] )
abline(
v = c( seq( 1, 9, 1 ), seq( 10, 90, 10 ), seq( 100, 1000, 100 ) ),
lty = 3,
col = colors()[ 440 ] )
points( y ~ x, data = d.f )
box()
lines(exp(logypred)~x, col=2)
为了测试更好地适应其他模型,我做了以下(这是指数模型,删除log()做线性):
exponential.model <- lm(log(x)~ y)
summary(exponential.model)
最后一步是使用我设法获得CDF的igraph包中的KS测试(KS.p):
http://igraph.org/r/doc/fit_power_law.html
最佳答案 包Emcdf提供了计算和绘制双变量或多变量累积分布函数的方法.
对于您的数据:
library(Emcdf)
df <- data.frame(x = c(1, 2, 3, 4, 5, 6, 7, 11, 13, 14),
y = c(48, 18, 9, 7, 5, 2, 2, 1, 1, 1))
plotcdf(as.matrix(df))
plotcdf(as.matrix(df), type = "wireframe")
这是你想要的?