我正在尝试为一些数据建模。我的Excel运气比R好,但Excel解决方案不会缩放,所以我需要在R中计算出如何做到这一点。
Excel会将趋势线映射到数据,而Power曲线会产生合理的y = 0.6462x ^ -0.542。
当我将相同的数据放入R并尝试使用poweRlaw
包中的连续幂律对其进行建模时,我得到类似y = 0.14901x^-3.03671
的内容。拦截太小了,而且alpha太大了。
# 14 days of % of users retained
y = c(0.61431 , 0.42585 , 0.35427 , 0.33893 , 0.28853 , 0.26004 , 0.2352 , 0.20087 , 0.17969 , 0.1848 , 0.17311 , 0.17092 , 0.15777 , 0.14901)
y.pl = conpl$new(y)
y.pl_est = estimate_xmin(c_pl)
y.pl_est
# $KS
# 0.1068587
#
# $xmin
# 0.14901
#
# $pars
# 3.03673
#
# $ntail
# 14
有没有办法使用lm
或glm
来做一个能产生合理拦截和alpha的功效曲线?
答案 0 :(得分:8)
似乎Excel可能会在日志范围内执行具有正常错误的线性模型 - 我将Excel结果与您在使用x
和y
日志时共享的小数位数相匹配建模。
使用@ eipi10的共享数据框:
dat = transform(dat, logx = log(x), logy = log(y))
mod = lm(logy ~ logx, data = dat)
## intercept
exp(coef(mod)[1])
# (Intercept)
# 0.6461621
## power
coef(mod)[2]
# logx
# -0.5424412
这当然有效,因为如果
y = a * x ^ b
log(y) = log(a) + b * log(x)
因此,线性模型的拟合系数在幂模型中为log(a)
和b
。
不同之处在于误差分布的假设。使用NLS的另一个答案是最小化功率标度上的平方误差 - 如果您假设y
中存在正态分布的误差,那么这是MLE。这种方法(显然也是Excel的方法)假设错误在对数刻度上是正常的,这意味着在未转换的量表上假设对数正态误差 - 这可能更合适。 (尽管从eipi的答案中可以看出,拟合值的差异非常小。)
答案 1 :(得分:6)
我还没有使用poweRlaw
软件包,但R的基本nls
(非线性最小二乘)函数给出了与Excel相似的结果。如果存在差异,在检查我的代码是否有错误之后,我的第一个想法就是#34;这对Excel来说更糟糕了。 :)
# Data
dat = data.frame(x=1:14,
y = c(0.61431 , 0.42585 , 0.35427 , 0.33893 , 0.28853 , 0.26004 , 0.2352 , 0.20087 , 0.17969 , 0.1848 , 0.17311 , 0.17092 , 0.15777 , 0.14901))
# Model
m1 = nls(y ~ a*x^b, list(a=1,b=1), data=dat)
summary(m1)
Formula: y ~ a * x^b
Parameters:
Estimate Std. Error t value Pr(>|t|)
a 0.62104 0.01307 47.51 4.94e-15 ***
b -0.51460 0.01525 -33.74 2.92e-13 ***
# Plot nls model
curve(coef(m1)[1]*x^coef(m1)[2], from=1, to=14)
# Add curve for Excel model in red
curve(0.6462*x^(-0.542), from=1, to=14, col="red", lty=2, add=TRUE)
# Add data points
points(dat$x, dat$y)