簡體   English   中英

相對於組中所有其他觀察值的加權觀察差(R)

[英]Weighted difference of observation relative to all other observation in a group (R)

我有以下示例數據。 X,Y和Z共分為三個組,觀察值1至9分為這些組。 對於每個觀察,我觀察變量A和B。因此:

test <- data.frame(
  id = 1:9,
  group = c(rep("X", 3), rep("Y", 3), rep("Z", 3)),
  A = seq(from = 0.15, to = 0.55, by = 0.05),
  B = 5:13
)

這使

  id group    A  B
1  1     X 0.15  5
2  2     X 0.20  6
3  3     X 0.25  7
4  4     Y 0.30  8
5  5     Y 0.35  9
6  6     Y 0.40 10
7  7     Z 0.45 11
8  8     Z 0.50 12
9  9     Z 0.55 13

我已經嘗試了一段時間了:對於每個觀察1至9,將那個觀察的A值相對於該觀察組的所有其他觀察的A值的加權差相加。 因此,對於觀察值1至4(作為示例),它應如下所示:

id 1: (0.15 - 0.15) * 5 + (0.15 - 0.20) * 6 + (0.15 - 0.25) * 7 = -1
id 2: (0.20 - 0.15) * 5 + (0.20 - 0.20) * 6 + (0.20 - 0.25) * 7 = -0.1
id 3: (0.25 - 0.15) * 5 + (0.25 - 0.20) * 6 + (0.25 - 0.25) * 7 = 0.8
id 4: (0.30 - 0.30) * 8 + (0.30 - 0.35) * 9 + (0.30 - 0.40) * 10 = -1.45

例如,對於觀察3,它翻譯為單詞:

步驟1:0.25是A上觀察值3的值,該值與A上觀察值1的值(即0.15)進行比較,該差值0.10被5加權(B上觀察值1的值)

步驟2:將0.25(A上的觀測值3的值)與A上的觀測值2的值(0.20)進行比較,並將0.05的差值乘以6(B上的觀測2的值)。

步驟3:將0.25(A上的觀測值3的值)與A上的(自己的值)進行比較,並將0的差值乘以7(B上的自身值)加權(我看到,鑒於0;為完整性起見添加)。

步驟4:步驟1-3的總和

有在R中實現此目標的可行方法嗎? 我一直在嘗試使用mutategroup_by ,但是到目前為止沒有成功。 任何幫助深表感謝。

您可以嘗試使用data.table

> test[, out := colSums(sapply(A, function(x) (x - A) * B)), by = "group"]
> test
   id group    A  B   out
1:  1     X 0.15  5 -1.00
2:  2     X 0.20  6 -0.10
3:  3     X 0.25  7  0.80
4:  4     Y 0.30  8 -1.45
5:  5     Y 0.35  9 -0.10
6:  6     Y 0.40 10  1.25
7:  7     Z 0.45 11 -1.90
8:  8     Z 0.50 12 -0.10
9:  9     Z 0.55 13  1.70

我要做的是:將自定義函數function(x) (x - A) * B)應用於列A每個元素,這為我提供了(A[i] - A[j]) * B[j]元素。 然后,我對各列求和,得到結果向量。

您可以使用group_by()和一些線性代數來做到這一點:

library(dplyr)

test <- data.frame(
  id = 1:9,
  group = c(rep("X", 3), rep("Y", 3), rep("Z", 3)),
  A = seq(from = 0.15, to = 0.55, by = 0.05),
  B = 5:13
)

test %>% group_by(group) %>%
  mutate(res = A*sum(B) - c(A%*%B))
#> # A tibble: 9 x 5
#> # Groups:   group [3]
#>      id group     A     B    res
#>   <int> <fct> <dbl> <int>  <dbl>
#> 1     1 X      0.15     5 -1.   
#> 2     2 X      0.2      6 -0.1  
#> 3     3 X      0.25     7  0.800
#> 4     4 Y      0.3      8 -1.45 
#> 5     5 Y      0.35     9 -0.1  
#> 6     6 Y      0.4     10  1.25 
#> 7     7 Z      0.45    11 -1.90 
#> 8     8 Z      0.5     12 -0.1  
#> 9     9 Z      0.55    13  1.70

reprex軟件包 (v0.2.1)創建於2019-01-21

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM