একটি সমাধান হ'ল mice
প্যাকেজটির জন্য আপনার নিজস্ব কাস্টম ইমপুটেশন ফাংশন লিখুন । প্যাকেজটি এর জন্য প্রস্তুত এবং সেটআপটি অবাক করে ব্যথা মুক্ত pain
প্রস্তাবিত হিসাবে প্রথমে আমরা ডেটা সেটআপ করি:
dat=data.frame(x1=c(21, 50, 31, 15, 36, 82, 14, 14, 19, 18, 16, 36, 583, NA,NA,NA, 50, 52, 26, 24),
x2=c(0, NA, 18,0, 19, 0, NA, 0, 0, 0, 0, 0, 0,NA,NA, NA, 22, NA, 0, 0),
x3=c(0, 0, 0, 0, 0, 54, 0 ,0, 0, 0, 0, 0, 0, NA, NA, NA, NA, 0, 0, 0))
এরপরে আমরা mice
প্যাকেজটি লোড করি এবং এটি ডিফল্টরূপে কী পদ্ধতি চয়ন করে তা দেখুন:
library(mice)
# Do a non-imputation
imp_base <- mice(dat, m=0, maxit = 0)
# Find the methods that mice chooses
imp_base$method
# Returns: "pmm" "pmm" "pmm"
# Look at the imputation matrix
imp_base$predictorMatrix
# Returns:
# x1 x2 x3
#x1 0 1 1
#x2 1 0 1
#x3 1 1 0
pmm
ঘোরা ভবিষ্যদ্বাণীপূর্ণ গড় ম্যাচিং একটানা ভেরিয়েবল আরোপিত হিসাবের জন্য সম্ভবত সবচেয়ে জনপ্রিয় নিন্দা অ্যালগরিদম -। এটি একটি রিগ্রেশন মডেল ব্যবহার করে পূর্বাভাসিত মানটি গণনা করে এবং 5 টি নিকটতম উপাদানকে পূর্বাভাসিত মানের ( ইউক্লিডিয়ান দূরত্ব দ্বারা ) বাছাই করে। এই নির্বাচিত উপাদানগুলিকে দাতা পুল বলা হয় এবং চূড়ান্ত মানটি এই দাতা পুল থেকে এলোমেলোভাবে বেছে নেওয়া হয়।
পূর্বাভাস ম্যাট্রিক্স থেকে আমরা দেখতে পেলাম যে পদ্ধতিগুলি ভেরিয়েবলগুলি নিষেধাজ্ঞার জন্য আগ্রহী বলে পাস করেছে interest নোট করুন যে সারিটি লক্ষ্য পরিবর্তনশীল এবং কলামটি পূর্বাভাসকারী। X3 এর এক্স 3 কলামে 1 না থাকলে আমাদের ম্যাট্রিক্সে এটি যুক্ত করতে হবে:imp_base$predictorMatrix["x1","x3"] <- 1
এখন মজাদার অংশে, ইমপ্লুটেশন পদ্ধতি তৈরি করা। আমি এখানে বরং একটি অপরিশোধিত পদ্ধতি নির্বাচন করেছি যেখানে আমি মানগুলি যদি মানদণ্ডগুলি পূরণ না করে তবে তা বাতিল করে দিই। এর ফলে দীর্ঘ লুপ সময় হতে পারে এবং এটি বৈধ ধারণাটি রাখার জন্য আরও কার্যকর হতে পারে এবং কেবলমাত্র অবশিষ্টগুলি পুনরায় করতে পারে তবে এর জন্য আরও কিছুটা টুইট করার প্রয়োজন হবে।
# Generate our custom methods
mice.impute.pmm_x1 <-
function (y, ry, x, donors = 5, type = 1, ridge = 1e-05, version = "",
...)
{
max_sum <- sum(max(x[,"x2"], na.rm=TRUE),
max(x[,"x3"], na.rm=TRUE))
repeat{
vals <- mice.impute.pmm(y, ry, x, donors = 5, type = 1, ridge = 1e-05,
version = "", ...)
if (all(vals < max_sum)){
break
}
}
return(vals)
}
mice.impute.pmm_x2 <-
function (y, ry, x, donors = 5, type = 1, ridge = 1e-05, version = "",
...)
{
repeat{
vals <- mice.impute.pmm(y, ry, x, donors = 5, type = 1, ridge = 1e-05,
version = "", ...)
if (all(vals == 0 | vals >= 14)){
break
}
}
return(vals)
}
mice.impute.pmm_x3 <-
function (y, ry, x, donors = 5, type = 1, ridge = 1e-05, version = "",
...)
{
repeat{
vals <- mice.impute.pmm(y, ry, x, donors = 5, type = 1, ridge = 1e-05,
version = "", ...)
if (all(vals == 0 | vals >= 16)){
break
}
}
return(vals)
}
একবার আমরা পদ্ধতিগুলি নির্ধারণ করার পরে আমরা সহজভাবে পূর্ববর্তী পদ্ধতিগুলি পরিবর্তন করি। আপনি যদি কেবল একটি একক ভেরিয়েবল পরিবর্তন করতে চান তবে আপনি কেবল ব্যবহার করতে পারেন imp_base$method["x2"] <- "pmm_x2"
তবে এই উদাহরণের জন্য আমরা সমস্ত পরিবর্তন করব (নামকরণ প্রয়োজনীয় নয়):
imp_base$method <- c(x1 = "pmm_x1", x2 = "pmm_x2", x3 = "pmm_x3")
# The predictor matrix is not really necessary for this example
# but I use it just to illustrate in case you would like to
# modify it
imp_ds <-
mice(dat,
method = imp_base$method,
predictorMatrix = imp_base$predictorMatrix)
এবার আসুন তৃতীয় অভিযুক্ত ডেটাসেটটি দেখে নেওয়া যাক:
> complete(imp_ds, action = 3)
x1 x2 x3
1 21 0 0
2 50 19 0
3 31 18 0
4 15 0 0
5 36 19 0
6 82 0 54
7 14 0 0
8 14 0 0
9 19 0 0
10 18 0 0
11 16 0 0
12 36 0 0
13 583 0 0
14 50 22 0
15 52 19 0
16 14 0 0
17 50 22 0
18 52 0 0
19 26 0 0
20 24 0 0
ঠিক আছে, এটি কাজ করে। আমি এই সমাধানটি পছন্দ করি কারণ আপনি মূলধারার ফাংশনগুলির শীর্ষে পিগব্যাক করতে পারেন এবং সীমাবদ্ধতাগুলি যোগ করতে পারেন যা আপনাকে অর্থবোধক বলে মনে হয়।
হালনাগাদ
মন্তব্যগুলিতে উল্লিখিত কঠোর বাধা @ t0x1n প্রয়োগের জন্য, আমরা মোড়কের কার্যকারিতাটিতে নিম্নলিখিত ক্ষমতাগুলি যুক্ত করতে চাই:
- লুপগুলির সময় বৈধ মানগুলি সংরক্ষণ করুন যাতে পূর্বের, আংশিকভাবে সফল রানগুলির ডেটা বাতিল না হয়
- অসীম লুপগুলি এড়ানোর জন্য একটি পালানোর ব্যবস্থা
- উপযুক্ত ম্যাচ না পেয়ে x বার চেষ্টা করার পরে দাতা পুলকে স্ফীত করুন (এটি প্রাথমিকভাবে বিকালবেলায় প্রযোজ্য)
এটি কিছুটা জটিল জটিল মোড়ক ফাংশনে ফলাফল:
mice.impute.pmm_x1_adv <- function (y, ry,
x, donors = 5,
type = 1, ridge = 1e-05,
version = "", ...) {
# The mice:::remove.lindep may remove the parts required for
# the test - in those cases we should escape the test
if (!all(c("x2", "x3") %in% colnames(x))){
warning("Could not enforce pmm_x1 due to missing column(s):",
c("x2", "x3")[!c("x2", "x3") %in% colnames(x)])
return(mice.impute.pmm(y, ry, x, donors = 5, type = 1, ridge = 1e-05,
version = "", ...))
}
# Select those missing
max_vals <- rowSums(x[!ry, c("x2", "x3")])
# We will keep saving the valid values in the valid_vals
valid_vals <- rep(NA, length.out = sum(!ry))
# We need a counter in order to avoid an eternal loop
# and for inflating the donor pool if no match is found
cntr <- 0
repeat{
# We should be prepared to increase the donor pool, otherwise
# the criteria may become imposs
donor_inflation <- floor(cntr/10)
vals <- mice.impute.pmm(y, ry, x,
donors = min(5 + donor_inflation, sum(ry)),
type = 1, ridge = 1e-05,
version = "", ...)
# Our criteria check
correct <- vals < max_vals
if (all(!is.na(valid_vals) |
correct)){
valid_vals[correct] <-
vals[correct]
break
}else if (any(is.na(valid_vals) &
correct)){
# Save the new valid values
valid_vals[correct] <-
vals[correct]
}
# An emergency exit to avoid endless loop
cntr <- cntr + 1
if (cntr > 200){
warning("Could not completely enforce constraints for ",
sum(is.na(valid_vals)),
" out of ",
length(valid_vals),
" missing elements")
if (all(is.na(valid_vals))){
valid_vals <- vals
}else{
valid_vals[is.na(valid_vals)] <-
vals[is.na(valid_vals)]
}
break
}
}
return(valid_vals)
}
নোট করুন যে এটি ভালভাবে সম্পাদন করে না, সম্ভবত প্রস্তাবিত ডেটা সেটটি অনুপস্থিত ছাড়া সমস্ত ক্ষেত্রে বাধা ব্যর্থ করে । এমনকি এটি আচরণ শুরু করার আগে আমাকে লুপের দৈর্ঘ্য 400-500 বৃদ্ধি করতে হবে। আমি ধরে নিই যে এটি অনিচ্ছাকৃত, আপনার অনুমানের আসল তথ্য কীভাবে উত্পন্ন হয় তা নকল করা উচিত।
অপ্টিমাইজেশান
যুক্তিটি ry
অনুপস্থিত মানগুলি অন্তর্ভুক্ত করে এবং আমরা সম্ভাব্য উপাদানগুলি যে উপযুক্ত ফলস্বরূপ পেয়েছি তা সরিয়ে আমরা লুপটি দ্রুততর করতে পারি, তবে আমি অভ্যন্তরীণ কার্যকারিতা সম্পর্কে অপরিচিত হিসাবে আমি এ থেকে বিরত রয়েছি।
আমার মনে হয় আপনার যখন দৃ strong় প্রতিবন্ধকতাগুলি পূর্ণ পূর্ণ হতে সময় লাগে তখন আপনার গুরুত্বপূর্ণ বিষয়গুলি হল আপনার ধারণার সমান্তরালতা ( ক্রসভিলেটেডে আমার উত্তর দেখুন )। বেশিরভাগের কাছে আজ 4-8 কোরের কম্পিউটার রয়েছে এবং আর কেবল সেগুলির মধ্যে একটি ডিফল্টরূপে ব্যবহার করে। কোরের সংখ্যা দ্বিগুণ করে সময়টি প্রায় (প্রায়) কাটা হতে পারে।
অনুমানের সময় প্যারামিটারগুলি অনুপস্থিত
x2
অনুমানের সময় নিখোঁজ হওয়ার সমস্যা সম্পর্কে - ইঁদুর আসলে অনুপস্থিত মানগুলি কখনই ফিড করে না x
- data.frame
। ইঁদুরের পদ্ধতি শুরুতে কিছু র্যান্ডম মান পূরণ অন্তর্ভুক্ত করা হয়েছে। অনুমানের শৃঙ্খলা-অংশ এই প্রাথমিক মান থেকে প্রভাব সীমাবদ্ধ করে। আপনি যদি mice
ফাংশনটির দিকে নজর দেন তবে আপনি এটি ইমপুটেশন কল (দ্য mice:::sampler
ফাংশন) এর আগে খুঁজে পাবেন :
...
if (method[j] != "") {
for (i in 1:m) {
if (nmis[j] < nrow(data)) {
if (is.null(data.init)) {
imp[[j]][, i] <- mice.impute.sample(y,
ry, ...)
}
else {
imp[[j]][, i] <- data.init[!ry, j]
}
}
else imp[[j]][, i] <- rnorm(nrow(data))
}
}
...
data.init
সরবরাহ করা যেতে পারে mice
ফাংশন এবং mice.imput.sample মৌলিক স্যাম্পলিং পদ্ধতি।
ভিজিটিং ক্রম
যদি পরিদর্শন ক্রমটি গুরুত্বপূর্ণ হয় তবে আপনি ক্রমটি নির্দিষ্ট করতে পারেন যাতে- mice
ফাংশন অনুপ্রবেশ চালায়। ডিফল্ট থেকে হয় 1:ncol(data)
তবে আপনি নিজের পছন্দমতো কিছু সেট visitSequence
করতে পারেন।
0 or 16 or >= 16
করতে0 or >= 16
যেহেতু>=16
মান অন্তর্ভুক্ত16
। আশা করি এটি আপনার অর্থকে বিশৃঙ্খলা করে না। একই জন্য0 or 14 or >= 14