連続変数と 2 つのカテゴリ ID 変数を含むデータセットがあります。連続変数が各 ID の特定の値に対して 1 の値を持つように、データをスケーリングしたいと思います。コーディングの繰り返しを避けるために、R の関数として実装しようとしています。
さらに、Stata で実装されたこの再スケーリングの例があります。
gen value_var_i_k= value_var if ID1=="15t16" & ID2 =="AUS"
egen value_var_i_k_m = mean(value_var_i_k)
drop value_var_i_k
rename value_var_i_k_m value_var_i_k
gen value_var_k= value_var if ID1 =="15t16"
bys ID2: egen value_var_k_m = mean(value_var_k)
drop value_var_k
rename value_var_k_m value_var_k
gen value_var_i = value_var if ID2=="AUS"
bys ID1: egen value_var_i_m = mean(value_var_i)
drop value_var_i
rename value_var_i_m value_var_i
gen value_var_i_k_norm= value_var * value_var_i_k/(value_var_i*value_var_k)
Rで新しい変数を使用してvalue_var_i value_var_k
and変数を作成しようとすると、エラーが発生して終了します(クラス「文字」には適用できないメソッド):value_var_i_k
library(dplyr)
library(magrittr)
normalize<-function(var,data,i,k) {
varname <- paste("value", var , sep="_")
#Id columns and define variables to select
col1<-"ID1"
col2<-"ID2"
select_variables<-c(col2,col1,varname)
#name of the output variables
name_ik<-paste(i,k,sep="_")
name.ik<-paste(name_ik, "df", sep="_")
name.i<-paste(i, "df", sep="_")
name.k<-paste(k, "df", sep="_")
#my attempt to replicate the Stata code with dplyr
data %>% filter_(as.name(col1)==as.name(i) & as.name(col2)==as.name(k)) %>% select_( .dots=select_variables) %$% as.name( name.ik)
data %>% filter_(as.name(col1)==as.name(i)) %>% select_( .dots = select_variables ) %>% group_by_(as.name(col2)) %>%transform( interp(~mean(b, na.rm = TRUE),b=as.name(varname) )) %$% as.name(name.i)
data %>% filter_(as.name(col2)==as.name(k)) %>% select_( .dots = select_variables ) %>% group_by_(as.name(col1)) %>%transform( interp(~mean(b, na.rm = TRUE),b=as.name(varname) )) %$% as.name(name.k)
norm <- data[eval(substitute(varname)]*as.name(name.ik)/ ( as.name(name.i) * as.name(name.k) )
}
更新 II:計算ステップを使用した最小限の作業例: 変数value_var
は両方の表で同じです。Stata コードは変数andを変数value_var_k
andに置き換えます。その後、変換されます。value_var_i
value_var_i_m
value_var_k_m
value_var
value_var ID1 ID2 value_var_i_k value_var_k value_var_k_m
1.154662 15t16 AUS 1.154662 1.154662 1.154662
1.070471 17t18 AUS 1.154662 . 1.154662
0.9643197 19 AUS 1.154662 . 1.154662
1.036398 20 AUS 1.154662 . 1.154662
1.084701 21t22 AUS 1.154662 . 1.154662
1.463215 15t16 AUT 1.154662 1.463215 1.463215
1.431824 17t18 AUT 1.154662 . 1.463215
1.276983 19 AUT 1.154662 . 1.463215
1.441925 20 AUT 1.154662 . 1.463215
1.506117 21t22 AUT 1.154662 . 1.463215
1.589491 15t16 BEL 1.154662 1.589491 1.589491
1.540076 17t18 BEL 1.154662 . 1.589491
1.188218 19 BEL 1.154662 . 1.589491
1.386074 20 BEL 1.154662 . 1.589491
1.48204 21t22 BEL 1.154662 . 1.589491
value_var ID1 ID2 value_var_i value_var_i_m
1.154662 15t16 AUS 1.154662 1.154662
1.589491 15t16 BEL . 1.154662
1.463215 15t16 AUT . 1.154662
1.070471 17t18 AUS 1.070471 1.070471
1.540076 17t18 BEL . 1.070471
1.431824 17t18 AUT . 1.070471
0.9643197 19 AUS 0.9643197 0.9643197
1.276983 19 AUT . 0.9643197
1.188218 19 BEL . 0.9643197
1.036398 20 AUS 1.036398 1.036398
1.441925 20 AUT . 1.036398
1.386074 20 BEL . 1.036398
1.084701 21t22 AUS 1.084701 1.084701
1.506117 21t22 AUT . 1.084701
1.48204 21t22 BEL . 1.084701
正規化された値 var は次のとおりです (ID1 レベル "15t16" および ID2 レベル "AUS" の正規化) :
ID1 ID2 value_var_i_k_norm
AUS 15t16 1
AUS 17t18 1
AUS 19 1
AUS 20 1
AUS 21t22 1
AUT 15t16 1
AUT 17t18 1.055508
AUT 19 1.044988
AUT 20 1.097901
AUT 21t22 1.09571
BEL 15t16 1
BEL 17t18 1.045116
BEL 19 .8951011
BEL 20 .9715319
BEL 21t22 .9925373
更新:正規化 (またはスケーリング) の手順をより明確にするために、正規化前のデータをワイド形式でここに示します。
まず、次のワイドデータから始めます
Row-/Colnames 15t16 17t18 19t 20t 21t22
AUS 1.154662 1.070471 0.9643197 1.036398 1.084701
AUT 1.463215 1.431824 1.276983 1.441925 1.506117
BEL 1.589491 1.540076 1.188218 1.386074 1.48204
AUS の値を持つ行と 15t16 の値を持つ列に行列を正規化します。だから、私は得るだろう
Row-/Colnames 15t16 17t18 19t 20t 21t22
AUS 1 1 1 1 1
AUT 1 1.055508 1.044988 1.097901 1.09571
BEL 1 1.045116 .8951011 .9715319 .9925373