如果我根据卡方分布绘制我的多元数据的马氏距离的多元 qqplot,我希望伴随的 qqline 是截距为 0 和斜率为 1 的线。但是如果我运行以下代码:
scores<-matrix(rnorm(100*3),nc=3)
mah_scores = mahalanobis(scores,center=colMeans(scores),cov=cov(scores))
chi_scores = qchisq(ppoints(nrow(scores)),df=3)
qqplot(x=chi_scores,y=mah_scores,asp=1)
abline(a=0,b=1)
qqline(mah_scores, distribution = function(p) qchisq(p,df = 3),col="red")
Run Code Online (Sandbox Code Playgroud)
我得到下图:

我希望 qqline(红色)与截距 0 和斜率 1(黑色)的线相同。谁能向我解释为什么这两行不匹配?
(我正在运行 R 版本 2.15.3 (2013-03-01))
此问题是此处提出和回答的 StackOverflow 问题的扩展。
我的情况有所不同,因为我想计算 50,000 个(或更多!)值的向量内每个值的百分位数。例如 -
df <- data.frame(val = rnorm(n = 50000, mean = 50, sd = 20))
df$val.percentile <- sapply(X = df$val, function(x) ecdf(df$val)(x))
head(df)
Run Code Online (Sandbox Code Playgroud)
有没有一种好方法来优化计算每个值的百分位数的过程?本质上,我希望使其尽可能高效,以便运行时间尽可能短。
我有一个包含组和值的数据框。首先,我计算每组的 99% 分位数。现在,我想删除每个组中高于 99% 分位数的值。
df<-data.frame(group = rep(c("A", "B"), each = 4),
value = c(c(6,5,80,4,60)*10,3,5,4))
# data
group value
1 A 60
2 A 50
3 A 800
4 A 40
5 B 600
6 B 3
7 B 5
8 B 4
Run Code Online (Sandbox Code Playgroud)
计算各个组的分位数
quant<-aggregate(df$value, by = list(df$group), FUN = quantile, probs = 0.99)
> quant
Group.1 x
1 A 777.80
2 B 582.15
Run Code Online (Sandbox Code Playgroud)
我尝试应用分位数向量来选择较低的值。然而,它错过了组规范。
df[df$value < quant$x,]
Run Code Online (Sandbox Code Playgroud)
预期结果:
group value
1 A 60
2 A 50
4 A 40 …Run Code Online (Sandbox Code Playgroud) 假设我有一个数据表,其中客户购买了这样的东西:
Customer|Price|Quantity Sold
a | 200 | 3.3
b | 120 | 4.1
c | 040 | 12.0
d | 030 | 16.76
Run Code Online (Sandbox Code Playgroud)
这应该是数据表的粗略表示,其中包含同一产品的客户、价格和销售数量。
我想弄清楚如何计算此信息的购买价格中位数。
我对方法有点困惑,因为我知道在 pandas 中获取分位数很容易data[row].quantile(x)
但由于每一行实际上代表多个观察结果,我不确定如何获取分位数。
编辑:最重要的是,主要问题是销售数量不离散。这是一个连续变量。(我们就像谈论米、公斤等,因此不能选择创建更多行。)
我发现一篇文章提供了计算分位数的算法,而 R 显然没有遵循该文章。
文章为: https://www-users.york.ac.uk/~mb55/intro/quantile.htm
在 R 中,我有以下代码:
nv<-c(10,20,30,40)
quantile(nv)
0% 25% 50% 75% 100%
10.0 17.5 25.0 32.5 40.0
Run Code Online (Sandbox Code Playgroud)
然而,75%结果的分位数似乎是错误的,根据文章,公式是:
i = q(n+1)
Run Code Online (Sandbox Code Playgroud)
在我的例子中(75%)q=0.75 且 n=4(我的组合中有 4 个观察值)
X_j + (X_j+1 - X_j) times (i - j)
Run Code Online (Sandbox Code Playgroud)
这意味着它应该是:
30 + (40-30)*(3.75-3) = 37.5而不是32.5
我很难认为 R 犯了一个错误。
我在这里缺少什么?
谢谢。
我目前有一个查询,其工作方式如下:
select AVG(t2 - t1) as delay,
percentile_cont(0.25) within group (order by (t2 - t1)) as q25,
percentile_cont(0.5) within group (order by (t2 - t1)) as median,
percentile_cont(0.75) within group (order by (t2 - t1)) as q75,
p.bool1,
p.cat1
from people p
group by p.bool1, p.cat1
order by p.cat1,p.bool1
Run Code Online (Sandbox Code Playgroud)
但是,我在 postgres 函数聚合页面上阅读: https://www.postgresql.org/docs/9.4/functions-aggregate.html
我应该能够指定多个分位数:
percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression) double precision[] double precision or interval array of sort expression's type multiple continuous percentile: returns an array of results matching …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用“dplyr”命令 mutate 创建一个变量,该变量必须指示另一个变量的分位数。
例如:
# 1. Fake data:
data <- data.frame(
"id" = seq(1:20),
"score" = round(rnorm(20,30,20)))
# 2. Creating varaible 'Quantile_5'
data <-data %>%
mutate(Quntile_5 = ????)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经创建了一个函数,该函数可以识别并返回分位数作为一个因子,并且该函数实际上有效
# 3. Create a function:
quantile5 <- function(x){
x = ifelse(
x < quantile(x,0.2),1,
ifelse(x >= quantile(x,0.2) & x < quantile(x,0.4),2,
ifelse(x >= quantile(x,0.4) & x < quantile(x,0.6),3,
ifelse(x >= quantile(x,0.6) & x < quantile(x,0.8),4,5
))))
return(as.factor(x))
}
# 4. Running the code:
data <-data %>%
mutate(Quntile_5 = quantile5(score))
# 5. …Run Code Online (Sandbox Code Playgroud) 我正在为我的数据集应用guantile回归(使用R).使用不同的分位数回归线(taus < - c(0.05,0.25,0.75,0.95))很容易产生漂亮的散点图.
当我想为这些分位数中的每一个产生p值(为了查看每个回归线的统计显着性)时出现问题.对于中值分位数(tau = 0.5),这不是问题,但是当涉及例如tau = 0.25时,我得到以下错误消息:
>QRmodel<-rq(y~x,tau=0.25,model=T)
>summary(QRmodel,se="nid")
Error in summary.rq(QRmodel, se = "nid") : tau - h < 0: error in summary.rq
Run Code Online (Sandbox Code Playgroud)
这可能是什么原因?
另外:建议提及有关分位数回归模型结果的p值和系数,或者仅仅显示情节图片并根据该图片讨论结果是否足够?
最好的问候,沮丧的人
乡亲
我有一个建筑物区域的温度数据,如下所示:
Lines <- "Date,Zone01,Zone02
01/01 01:00:00,24.5,21.3
01/01 02:00:00,24.3,21.1
01/01 03:00:00,24.1,21.1
01/01 04:00:00,24.1,20.9
01/01 05:00:00,25.,21.
01/01 06:00:00,26.,21.
01/01 07:00:00,26.6,22.3
01/01 08:00:00,28.,24.
01/01 09:00:00,28.9,26.5
01/01 10:00:00,29.4,29
01/01 11:00:00,30.,32.
01/01 12:00:00,33.,35.
01/01 13:00:00,33.4,36
01/01 14:00:00,35.8,38
01/01 15:00:00,32.3,37
01/01 16:00:00,30.,34.
01/01 17:00:00,29.,33.
01/01 18:00:00,28.,32.
01/01 19:00:00,26.3,30
01/01 20:00:00,26.,28.
01/01 21:00:00,25.9,25
01/01 22:00:00,25.8,21.3
01/01 23:00:00,25.6,21.4
01/01 24:00:00,25.5,21.5
01/02 01:00:00,25.4,21.6
01/02 02:00:00,25.3,21.8"
Run Code Online (Sandbox Code Playgroud)
我想要做的是计算每个区域的第99百分位的温度.我会做这个命令:
Q=quantile(Lines$Zone01,0.99)
Run Code Online (Sandbox Code Playgroud)
但是,我必须手动为数据集中的每一列执行此操作.有没有办法让这个命令遍历所有列(从第二列开始)?
非常感谢.
R中是否有一个实现的(!)函数,它为每个值提供经验分位数?我找不到任何......
假设我们有x
x = c(1,3,4,2)
Run Code Online (Sandbox Code Playgroud)
我想要每个元素的分位数.
[1] 0.25, 0.75, 1, 0.5
Run Code Online (Sandbox Code Playgroud)
非常感谢你!
quantile ×10
r ×8
dataframe ×2
dplyr ×1
ecdf ×1
loops ×1
pandas ×1
plot ×1
postgresql ×1
python ×1
regression ×1
select ×1
statistics ×1