मौजूदा चर के लिए एक परिभाषित सहसंबंध के साथ एक यादृच्छिक चर उत्पन्न करें


71

सिमुलेशन अध्ययन के लिए मुझे यादृच्छिक चर उत्पन्न करना होगा जो मौजूदा चर लिए पूर्वनिर्मित (जनसंख्या) सहसंबंध दिखाते हैं ।Y

मैंने Rपैकेजों पर ध्यान दिया copulaऔर CDVineजो एक दी गई निर्भरता संरचना के साथ यादृच्छिक बहुभिन्नरूपी वितरण का उत्पादन कर सकते हैं। हालाँकि, किसी मौजूदा चर के परिणामस्वरूप चर को ठीक करना संभव नहीं है।

किसी भी विचार और मौजूदा कार्यों के लिंक की सराहना की जाती है!


निष्कर्ष: विभिन्न समाधानों के साथ दो मान्य उत्तर आए:

  1. कैराकल द्वारा एक R स्क्रिप्ट , जो एक पूर्वनिर्धारित चर के लिए एक सटीक (नमूना) सहसंबंध के साथ एक यादृच्छिक चर की गणना करता है
  2. एक R फ़ंक्शन मैंने खुद को पाया, जो एक पूर्वनिर्धारित चर से परिभाषित जनसंख्या सहसंबंध के साथ एक यादृच्छिक चर की गणना करता है

[@ttnphns 'जोड़: मैंने एकल शीर्षक चर मामले से मनमाने ढंग से तय चर की संख्या का विस्तार करने के लिए स्वतंत्रता ली; यानी कुछ निश्चित, मौजूदा चर (ओं) के साथ पूर्वनिर्धारित राज्याभिषेक वाले चर उत्पन्न करने के लिए कैसे]


2
यह संबंधित प्रश्न आँकड़े देखें ।stackexchange.com/ questions/ 13382/… जो सीधे आपके प्रश्न (कम से कम इसके सिद्धांत पक्ष) को संबोधित करता है।
मैक्रों

जवाबों:


56

यहाँ एक और है: मीन 0 के साथ वैक्टर के लिए, उनका सहसंबंध उनके कोण के कोसाइन के बराबर है। तो एक वेक्टर खोजने का एक तरीका बिल्कुल वांछित सहसंबंध , कोण अनुरूप :r θxrθ

  1. निश्चित वेक्टर और एक यादृच्छिक वेक्टरx 2x1x2
  2. केंद्र दोनों वैक्टर (मतलब 0), जिससे वैक्टर , ˙ एक्स 2x˙1x˙2
  3. make orthogonal to (orthogonal subspace पर प्रक्षेपण), जिससे ˙ एक्स 1 ˙ एक्स 2x˙2x˙1x˙2
  4. स्केल और से लंबाई 1 तक, औरx ˉ 2 ˉ x 1x ˙ 2x˙1x˙2x¯1x¯2
  5. ˉ एक्स 1θ ˉ एक्स 1आरएक्स1x¯2+(1/tan(θ))x¯1 वह वेक्टर है जिसका कोण to is , और जिसका सहसंबंध इस प्रकार । यह का सहसंबंध भी है क्योंकि रैखिक परिवर्तन सहसंबंध को अपरिवर्तित छोड़ देते हैं।x¯1θx¯1rx1

यहाँ कोड है:

n     <- 20                    # length of vector
rho   <- 0.6                   # desired correlation = cos(angle)
theta <- acos(rho)             # corresponding angle
x1    <- rnorm(n, 1, 1)        # fixed given data
x2    <- rnorm(n, 2, 0.5)      # new random data
X     <- cbind(x1, x2)         # matrix
Xctr  <- scale(X, center=TRUE, scale=FALSE)   # centered columns (mean 0)

Id   <- diag(n)                               # identity matrix
Q    <- qr.Q(qr(Xctr[ , 1, drop=FALSE]))      # QR-decomposition, just matrix Q
P    <- tcrossprod(Q)          # = Q Q'       # projection onto space defined by x1
x2o  <- (Id-P) %*% Xctr[ , 2]                 # x2ctr made orthogonal to x1ctr
Xc2  <- cbind(Xctr[ , 1], x2o)                # bind to matrix
Y    <- Xc2 %*% diag(1/sqrt(colSums(Xc2^2)))  # scale columns to length 1

x <- Y[ , 2] + (1 / tan(theta)) * Y[ , 1]     # final new vector
cor(x1, x)                                    # check correlation = rho

यहाँ छवि विवरण दर्ज करें

ऑर्थोगोनल प्रोजेक्शन , मैंने संख्यात्मक स्थिरता में सुधार के लिए -decomposition का उपयोग किया , तब से बस ।क्यू आर पी = क्यू क्यू 'PQRP=QQ


मैं SPSS सिंटैक्स में कोड को फिर से लिखना चाह रहा था। मैं आपके क्यूआर अपघटन पर ठोकर खाता हूं जो 20x1 कॉलम लौटाता है। एसपीएसएस में मेरे पास ग्राम-श्मिट ऑर्थोनॉर्मलाइज़ेशन है (जो एक क्यूआर अपघटन भी है) लेकिन आपके परिणामी क्यू कॉलम को दोहराने में असमर्थ है। क्या आप कृपया मुझे अपनी QR कार्रवाई पर चबा सकते हैं या प्रक्षेपण प्राप्त करने के लिए कुछ काम के आसपास इंगित करें। धन्यवाद।
ttnphns

@caracal, P <- X %*% solve(t(X) %*% X) %*% t(X)r = 0.6 का उत्पादन नहीं करता है, इसलिए यह काम के आसपास नहीं है। मैं अभी भी असमंजस में हूँ। (मुझे Q <- qr.Q(qr(Xctr[ , 1, drop=FALSE]))SPSS में आपकी अभिव्यक्ति की नकल करने में खुशी होगी लेकिन पता नहीं कैसे।)
ttnphns

@ttnphns भ्रम के लिए क्षमा करें, मेरी टिप्पणी सामान्य मामले के लिए थी। उदाहरण के लिए इसे स्थिति पर लागू करना: क्यूआर-अपघटन के माध्यम से प्रक्षेपण मैट्रिक्स प्राप्त करना केवल संख्यात्मक स्थिरता के लिए है। आप प्रक्षेपण मैट्रिक्स को रूप में प्राप्त कर सकते हैं यदि उप-मैट्रिक्स मैट्रिक्स के स्तंभों द्वारा स्‍पष्‍ट किया जाता है । आर में, आप यहां लिख सकते हैं क्योंकि उप-स्तंभ के पहले कॉलम द्वारा स्पान किया गया है । ऑर्थोगोनल पूरक पर प्रक्षेपण के लिए मैट्रिक्स तब आईपी है। एक्सP=X(XX)1XXXctr[ , 1] %*% solve(t(Xctr[ , 1]) %*% Xctr[ , 1]) %*% t(Xctr[ , 1])Xctr
caracal

4
क्या कोई स्पष्ट कर सकता है कि केवल दो नमूनों की तुलना में अधिक के लिए कुछ समान प्रदर्शन कैसे करें? कहो, अगर मैं 3 नमूने चाहता था जो आरएचओ द्वारा सहसंबद्ध युग्मक हैं, तो मैं इसे प्राप्त करने के लिए इस समाधान को कैसे बदल सकता हूं?
आंद्रे टेरा

सीमा मामले के लिए rho=1मुझे ऐसा कुछ करने के लिए उपयोगी पाया गया: if (isTRUE(all.equal(rho, 1))) rho <- 1-10*.Machine$double.epsअन्यथा, मैं NaNs मिल रहा था
PatrickT

19

मैं सबसे सामान्य संभव समाधान का वर्णन करूंगा। इस सामान्यता में समस्या को हल करने से हमें एक उल्लेखनीय कॉम्पैक्ट सॉफ़्टवेयर कार्यान्वयन प्राप्त करने की अनुमति मिलती है: Rकोड प्रत्यय की सिर्फ दो छोटी लाइनें ।

आप की तरह किसी भी वितरण के अनुसार , एक ही लंबाई के , के रूप में एक वेक्टर चुनें को विरुद्ध के न्यूनतम वर्ग प्रतिगमन के अवशिष्ट होने दें : यह से घटक को निकालता है । एक उपयुक्त गुणक को वापस जोड़कर , हम साथ किसी भी वांछित सहसंबंध वाले वेक्टर का उत्पादन कर सकते हैं । एक मनमाना additive स्थिर और सकारात्मक गुणक स्थिरांक तक - जिसे आप किसी भी तरह से चुनने के लिए स्वतंत्र हैं - समाधान हैवाई वाई एक्स वाई वाई एक्स वाई वाई ρ YXYYXYYXYYρY

XY;ρ=ρSD(Y)Y+1ρ2SD(Y)Y.

(" " मानक विचलन के लिए आनुपातिक किसी भी गणना के लिए खड़ा है।)SD


यहां वर्किंग Rकोड है। यदि आप आपूर्ति नहीं करते हैं , तो कोड मल्टीवेरेट मानक सामान्य वितरण से इसके मूल्यों को आकर्षित करेगा।X

complement <- function(y, rho, x) {
  if (missing(x)) x <- rnorm(length(y)) # Optional: supply a default if `x` is not given
  y.perp <- residuals(lm(x ~ y))
  rho * sd(y.perp) * y + y.perp * sd(y) * sqrt(1 - rho^2)
}

वर्णन करने के लिए, मैंने घटकों के साथ एक यादृच्छिक उत्पन्न किया और इस साथ विभिन्न निर्दिष्ट सहसंबंध होने वाले उत्पादन किया । वे सभी एक ही शुरुआती वेक्टर के साथ बनाए गए थे । यहाँ उनके बिखराव हैं। प्रत्येक पैनल के नीचे स्थित "रगप्लॉट्स" सामान्य वेक्टर दिखाते हैं ।Y50XY;ρYX=(1,2,,50)Y

आकृति

भूखंडों के बीच एक उल्लेखनीय समानता है, वहाँ :-) नहीं है।


यदि आप प्रयोग करना चाहते हैं, तो यहां कोड है जो इन आंकड़ों और आंकड़ों का उत्पादन करता है। (मैंने आसान संचालन के लिए परिणामों को शिफ्ट और स्केल करने की स्वतंत्रता का उपयोग करने की जहमत नहीं उठाई।)

y <- rnorm(50, sd=10)
x <- 1:50 # Optional
rho <- seq(0, 1, length.out=6) * rep(c(-1,1), 3)
X <- data.frame(z=as.vector(sapply(rho, function(rho) complement(y, rho, x))),
                rho=ordered(rep(signif(rho, 2), each=length(y))),
                y=rep(y, length(rho)))

library(ggplot2)
ggplot(X, aes(y,z, group=rho)) + 
  geom_smooth(method="lm", color="Black") + 
  geom_rug(sides="b") + 
  geom_point(aes(fill=rho), alpha=1/2, shape=21) +
  facet_wrap(~ rho, scales="free")

BTW, यह विधि आसानी से एक से अधिक तक सामान्य हो जाती है : यदि यह गणितीय रूप से संभव है, तो यह एक को एक संपूर्ण सह-संबंध के साथ निर्दिष्ट सेट । से सभी के प्रभावों को बाहर करने के लिए बस साधारण कम से कम वर्गों का उपयोग करें और और का एक उपयुक्त रैखिक संयोजन । (यह लिए एक दोहरे आधार के संदर्भ में ऐसा करने में मदद करता है , जो एक छद्म व्युत्क्रम की गणना करके प्राप्त किया जाता है। follownig कोड उस को पूरा करने के लिए के SVD का उपयोग करता है।)YXY1,Y2,,Yk;ρ1,ρ2,,ρkYiYiXYiYY

यहाँ एल्गोरिथ्म का एक स्केच है R, जिसमें को एक मैट्रिक्स के कॉलम के रूप में दिया गया है :Yiy

y <- scale(y)             # Makes computations simpler
e <- residuals(lm(x ~ y)) # Take out the columns of matrix `y`
y.dual <- with(svd(y), (n-1)*u %*% diag(ifelse(d > 0, 1/d, 0)) %*% t(v))
sigma2 <- c((1 - rho %*% cov(y.dual) %*% rho) / var(e))
return(y.dual %*% rho + sqrt(sigma2)*e)

निम्नलिखित उन लोगों के लिए अधिक पूर्ण कार्यान्वयन है जो प्रयोग करना चाहते हैं।

complement <- function(y, rho, x) {
  #
  # Process the arguments.
  #
  if(!is.matrix(y)) y <- matrix(y, ncol=1)
  if (missing(x)) x <- rnorm(n)
  d <- ncol(y)
  n <- nrow(y)
  y <- scale(y) # Makes computations simpler
  #
  # Remove the effects of `y` on `x`.
  #
  e <- residuals(lm(x ~ y))
  #
  # Calculate the coefficient `sigma` of `e` so that the correlation of
  # `y` with the linear combination y.dual %*% rho + sigma*e is the desired
  # vector.
  #
  y.dual <- with(svd(y), (n-1)*u %*% diag(ifelse(d > 0, 1/d, 0)) %*% t(v))
  sigma2 <- c((1 - rho %*% cov(y.dual) %*% rho) / var(e))
  #
  # Return this linear combination.
  #
  if (sigma2 >= 0) {
    sigma <- sqrt(sigma2) 
    z <- y.dual %*% rho + sigma*e
  } else {
    warning("Correlations are impossible.")
    z <- rep(0, n)
  }
  return(z)
}
#
# Set up the problem.
#
d <- 3           # Number of given variables
n <- 50          # Dimension of all vectors
x <- 1:n         # Optionally: specify `x` or draw from any distribution
y <- matrix(rnorm(d*n), ncol=d) # Create `d` original variables in any way
rho <- c(0.5, -0.5, 0)          # Specify the correlations
#
# Verify the results.
#
z <- complement(y, rho, x)
cbind('Actual correlations' = cor(cbind(z, y))[1,-1],
      'Target correlations' = rho)
#
# Display them.
#
colnames(y) <- paste0("y.", 1:d)
colnames(z) <- "z"
pairs(cbind(z, y))

यह वास्तव में एक अच्छा समाधान है। हालाँकि, मैं इसे कई चर (निश्चित चर, आपके उत्तर में) के मामले में खुद को विस्तारित करने में विफल रहा । , तुम दावा करते हो। क्या आप इसे प्रदर्शित कर सकते हैं? कृपया, आर उपयोगकर्ता द्वारा नहीं पढ़ा जा सकता है। YBTW, this method readily generalizes to more... Just use ordinary least squares... and form a suitable linear combination
ttnphns

1
@ttnphns मैंने ऐसा किया है।
whuber

1
आपका बहुत बहुत धन्यवाद! मैं देखता हूं, और मैंने आज एसपीएसएस में अपने दृष्टिकोण को खुद के लिए कोडित कर दिया है। वास्तव में आपका बहुत अच्छा प्रस्ताव। मैंने कार्य को हल करने के लिए दोहरे आधार की धारणा के बारे में कभी नहीं सोचा था।
tnnphns

क्या समान रूप से वितरित वेक्टर के साथ आने के लिए एक समान दृष्टिकोण का उपयोग करना संभव है? यही है, मेरे पास एक मौजूदा वेक्टर है xऔर इसके yसाथ सहसंबद्ध एक नया वेक्टर उत्पन्न xकरना चाहते हैं, लेकिन यह भी चाहते हैं कि yवेक्टर समान रूप से वितरित किया जाए।
स्क्यूमिन

@ सकुमिन इसके लिए एक कोप्युला का उपयोग करने पर विचार करें ताकि आप दोनों वैक्टरों के बीच संबंधों को नियंत्रित कर सकें।
whuber

6

यहां एक और कम्प्यूटेशनल दृष्टिकोण है (समाधान एनरिको शूमान द्वारा एक फोरम पोस्ट से अनुकूलित किया गया है )। वोल्फगैंग (टिप्पणियों को देखें) के अनुसार, यह कम्प्यूटेशनल रूप से ttnphns द्वारा प्रस्तावित समाधान के समान है।

कैराकल के समाधान के विपरीत यह के सटीक सहसंबंध के साथ एक नमूना नहीं देता है , लेकिन दो वैक्टर जिनके जनसंख्या सहसंबंध बराबर हैं ।ρρ

निम्नलिखित कार्य किसी दिए गए साथ जनसंख्या से निकाले गए एक द्विभाजित नमूना वितरण की गणना कर सकते हैं । यह या तो दो यादृच्छिक चर की गणना करता है, या यह एक मौजूदा चर (पैरामीटर के रूप में पारित ) लेता है और वांछित सहसंबंध के साथ दूसरा चर बनाता है:ρx

# returns a data frame of two variables which correlate with a population correlation of rho
# If desired, one of both variables can be fixed to an existing variable by specifying x
getBiCop <- function(n, rho, mar.fun=rnorm, x = NULL, ...) {
     if (!is.null(x)) {X1 <- x} else {X1 <- mar.fun(n, ...)}
     if (!is.null(x) & length(x) != n) warning("Variable x does not have the same length as n!")

     C <- matrix(rho, nrow = 2, ncol = 2)
     diag(C) <- 1

     C <- chol(C)

     X2 <- mar.fun(n)
     X <- cbind(X1,X2)

     # induce correlation (does not change X1)
     df <- X %*% C

     ## if desired: check results
     #all.equal(X1,X[,1])
     #cor(X)

     return(df)
}

पैरामीटर का समायोजन करके फ़ंक्शन गैर-सामान्य सीमांत वितरण का भी उपयोग कर सकता है mar.fun। ध्यान दें, हालांकि, एक चर को ठीक करने के लिए केवल एक सामान्य रूप से वितरित चर के साथ काम करना लगता है x! (जो मैक्रों की टिप्पणी से संबंधित हो सकता है)।

यह भी ध्यान दें कि मूल पोस्ट से "छोटे सुधार कारक" को हटा दिया गया था क्योंकि यह परिणामस्वरूप सहसंबंधों को पूर्वाग्रह करता है, कम से कम गौसियन वितरण और पियर्सन सहसंबंध के मामले में (टिप्पणियों को भी देखें)।


ऐसा लगता है कि यह केवल एक अनुमानित समाधान है, यानी, अनुभवजन्य सहसंबंध वास्तव में बराबर नहीं है । या क्या मैं कुछ न कुछ भूल रहा हूं? ρ
caracal

1
यह दिखाना आसान है कि, "आरएचओ के लिए छोटे सुधार" को छोड़कर (इस संदर्भ में इसका उद्देश्य मुझे याद दिलाता है), यह बिल्कुल वैसा ही है जैसा कि पहले ttnphns ने सुझाया था। विधि बस वांछित परिवर्तन मैट्रिक्स प्राप्त करने के लिए सहसंबंध मैट्रिक्स के चोल्स्की अपघटन पर आधारित है। उदाहरण के लिए देखें: en.wikipedia.org/wiki/… । और हां, यह आपको केवल दो वैक्टर देगा जिनकी जनसंख्या सहसंबंध बराबर है rho
वोल्फगैंग

"आरएचओ के लिए छोटा सुधार" मूल पोस्ट में था और यहां वर्णित है । वास्तव में, मैं वास्तव में इसे नहीं समझता; लेकिन rho = .3 के साथ 50000 सिम्युलेटेड सहसंबंधों की एक जांच से पता चलता है कि "छोटे सुधार के बिना " r का .299 का औसत उत्पन्न होता है, जबकि सुधार के साथ .312 का औसत (जो सही किए गए भो का मान है) है। का उत्पादन किया। इसलिए मैंने उस हिस्से को फंक्शन से हटा दिया।
फेलिक्स एस

मुझे पता है कि यह पुराना है, लेकिन मैं यह भी ध्यान देना चाहता हूं कि यह विधि गैर-सकारात्मक निश्चित सहसंबंध मैट्रीस के लिए काम नहीं करेगी। जैसे - -1 का सहसंबंध।
zzk

1
धन्यवाद; मैंने देखा है कि अगर x1 मानकीकृत नहीं है मतलब = 0, एसडी = 1, और आप बल्कि यह rescale, आप लाइन को संशोधित करना होगा नहीं चाहते हैं: X2 <- mar.fun(n)करने के लिए X2 <- mar.fun(n,mean(x),sd(x))x1 और x2 के बीच वांछित सहसंबंध पाने के लिए
डेव एम

6

चलो अपने तय चर हो सकता है और आप उत्पन्न करना चाहते चर के साथ संबद्ध राशि से । यदि को मानकीकृत किया गया है (क्योंकि साधारण प्रतिगमन में बीटा गुणांक है) , जहां सामान्य वितरण से यादृच्छिक चर है जिसका अर्थ और । और डेटा के बीच मनाया सहसंबंध लगभग ; और को बीवरिएट सामान्य आबादी से यादृच्छिक नमूने के रूप में देखा जा सकता है (यदिXYXrXrY=rX+EE0sd=1r2XYrXYX सामान्य से है) ।ρ=r

अब, अगर आप अपने द्विचर नमूने में सह-संबंध को प्राप्त करना चाहते हैं वास्तव में , आपको लगता है कि उपलब्ध कराने की आवश्यकता है शून्य के साथ सहसंबंध । इसे शून्य तक कसने से इसे पुन: संशोधित करके तक पहुँचा जा सकता है । खैर, केवल दो चर, एक दिए गए ( ) और एक ( ) उत्पन्न करने के लिए , पुनरावृत्तियों की पर्याप्त संख्या वास्तव में 1 है, लेकिन कई दिए गए चर ( ) पुनरावृत्तियों के साथ की आवश्यकता होगी।rEXEXYX1,X2,X3,...

यह ध्यान दिया जाना चाहिए कि यदि सामान्य है तो पहली प्रक्रिया में ("लगभग ") भी सामान्य होगा; हालांकि, "सटीक " पुनरावृत्ति फिटिंग में को सामान्यता खोने की संभावना है क्योंकि फिटिंग मामले के मान का चयन करता है।XrYYrY


11 नवंबर, 2017 को अपडेट करें । मैं आज इस पुराने धागे पर आया हूं और पुनरावृति फिटिंग के एल्गोरिथ्म को दिखाते हुए अपने उत्तर का विस्तार करने का फैसला किया है जिसके बारे में मैं शुरू में बोल रहा था।

यहाँ एक पुनरावृत्ति समाधान करने के लिए कैसे है एक बेतरतीब ढंग से नकली या preexistent चर प्रशिक्षित सहसंबंधी या covariate को ठीक के रूप में हम चाहते हैं - (पुनरावृत्तियों की संख्या के आधार पर या बहुत करीब इतना करने के लिए) दिया चर का एक सेट के साथ रों (इन संशोधित नहीं किया जा सकता है)।Y X

विस्मयादिबोधक: इस पुनरावृत्त समाधान को मैंने दोहरे आधार खोजने के आधार पर उत्कृष्ट के लिए अवर पाया है और आज इस थ्रेड में @whuber द्वारा प्रस्तावित किया गया है। @ व्हिबर का समाधान पुनरावृत्ति नहीं है और, मेरे लिए और अधिक महत्वपूर्ण बात यह है कि यह इनपुट "सुअर" चर के मूल्यों को "मेरे" एल्गोरिथम से कुछ हद तक प्रभावित करता है (यह एक परिसंपत्ति होगी तो यदि कार्य "सही" करना है मौजूदा वैरिएबल और स्क्रैच से रैंडम वेरिएंट उत्पन्न करने के लिए नहीं)। फिर भी, मैं जिज्ञासा के लिए मेरा प्रकाशन कर रहा हूं और क्योंकि यह काम करता है (फुटनोट भी देखें)।

तो, हम दे दिया है (निर्धारित) चर , और varible जो कोई बस बेतरतीब ढंग से "सुअर" मूल्यों का उत्पन्न या एक बराबर डेटा चर के मान हम जरूरत के लिए 'सही' है - लाने के लिए वास्तव में सह-संबंध के लिए (या इसे सहप्रसरण हो सकता है) साथ रों। सभी डेटा निरंतर होना चाहिए; दूसरे शब्दों में, अद्वितीय मूल्यों का एक अच्छा सौदा होना चाहिए।X1,X2,...,XmYYr1,r2,...,rmX

विचार: अवशिष्ट की पुनरावृत्ति फिटिंग करना। चाहता था (लक्ष्य) सहसंबंध / सहप्रसरण जानने के बाद, हम भविष्यवाणी के लिए मूल्यों की गणना कर सकते हैं का उपयोग कर रों के रूप में कई रैखिक भविष्यवक्ताओं। प्रारंभिक अवशेष (वर्तमान और आदर्श भविष्यवाणी से) प्राप्त करने के बाद , उन्हें पुनरावृत्तियों से प्रशिक्षित करें ताकि वे भविष्यवक्ताओं के साथ संबंध न रखें। अंत में, अवशेषों के साथ को फिर से हासिल करें । (यह प्रक्रिया कई वर्षों पहले पहिया का मेरा खुद का प्रायोगिक आविष्कार था जब मुझे कोई भी सिद्धांत नहीं पता था; मैंने इसे एसपीएसएस में कोडित किया था।)YXYY

  1. लक्ष्य को sums-of- उन्हें : द्वारा गुणा करें । ( एक वेरिएबल इंडेक्स है।)rdf=n1Sj=rjdfjX

  2. सभी चर (केंद्र प्रत्येक को जेड-मानकीकृत करें, फिर उस उपरोक्त पर गणना किए गए सेंट विचलन द्वारा विभाजित करें )। और s इस प्रकार मानक हैं। वर्गों के देखे गए योग अब = ।dfYXdf

  3. लक्ष्य : अनुसार s द्वारा भविष्यवाणी करने वाले प्रतिगामी गुणांक की गणना करें ।YXrb=(XX)1S

  4. : लिए अनुमानित मूल्यों की गणना करें ।YY^=Xb

  5. अवशिष्टों की गणना ।E=YY^

  6. अवशिष्टों के लिए वर्गों की आवश्यक (लक्ष्य) राशि की गणना करें: ।SSS=dfSSY^

  7. (पुनरावृति शुरू करें।) गणना में वर्तमान और हर बीच :EXjCj=i=1nEiXij

  8. सभी को करीब लाने के उद्देश्य से का सही मान ( एक केस इंडेक्स है):EC0i

    Ei[corrected]=Eij=1mCjXijnj=1mXij2

    (भाजक पुनरावृत्तियों पर परिवर्तित नहीं होता है, पहले से गणना करें)

    या, वैकल्पिक रूप से, एक अधिक कुशल सूत्र अतिरिक्त रूप से का मतलब हो जाता है । पहले, चरण 7 में की प्रत्येक गणना से पहले प्रत्येक पुनरावृत्ति पर केंद्र , फिर इस चरण 8 पर इस प्रकार सही करें:E0 EC

    Ei[corrected]=Eij=1mCjXij3i=1nXij2j=1mXij2

    (फिर से, भाजक पहले से ज्ञात हैं)1

  9. लाओ अपने लक्ष्य मूल्य के लिए:SSEEi[corrected]=EiSSS/SSE

    चरण 7. पर जाएं (कहते हैं, 10-20 पुनरावृत्तियों; अधिक से अधिक की आवश्यकता है और पुनरावृत्तियों की आवश्यकता हो सकती है। यदि लक्ष्य यथार्थवादी थे, तो सकारात्मक है, और यदि नमूना आकार बहुत कम नहीं है, पुनरावृत्तियों हमेशा होती है अभिसरण के लिए प्रत्यक्ष। अंत पुनरावृत्ति।)mrSSSn

  10. तैयार: सभी एस लगभग शून्य हैं, जिसका मतलब है कि अवशिष्ट को लक्षित एस को बहाल करने के लिए प्रशिक्षित किया गया है । फिटिंग : गणना करें ।आर वाई वाई [ सुधारा ] = Y + CErYY[corrected]=Y^+E

  11. प्राप्त लगभग मानकीकृत है। अंतिम स्ट्रोक के रूप में, आप इसे ठीक से मानकीकृत करना चाह सकते हैं, जैसे आपने चरण 2 पर किया था।Y

  12. आप की आपूर्ति कर सकते किसी के साथ विचरण और मतलब आप की तरह। दरअसल, चार आंकड़ों में से - न्यूनतम , अधिकतम , माध्य , सेंट। देव । - आप किसी भी दो मानों का चयन कर सकते हैं और रैखिक चर बदलना तो यह उन्हें बदले बिना posesses एस (सहसम्बन्ध) आप प्राप्त कर ली है (यह सब कहा जाता है रैखिक rescaling है)।Yr

फिर से चेतावनी देने के लिए कि ऊपर क्या कहा गया था। के उस बिल्कुल खींचने के साथ , आउटपुट को सामान्य रूप से वितरित नहीं करना पड़ता है।YrY


वाई एक्स1 सुधार सूत्र आगे परिष्कृत हो सकता है, उदाहरण के लिए, हर साथ साथ अधिक से अधिक समरूपता (sums-of-squares के संदर्भ में) का बीमा करना , साथ ही साथ सहसंबंधों को प्राप्त करना, - मैंने इसके लिए एक कोड लागू किया है भी। (मुझे नहीं पता कि इस तरह के "डबल" कार्य एक अधिक साफ-सुथरे - अनैच्छिक - जैसे कि व्हीलर के माध्यम से हल करने योग्य हैं ।YX


1
आपके उत्तर के लिए धन्यवाद। यह एक अनुभवजन्य / पुनरावृत्ति समाधान है जिसके बारे में मैं भी सोच रहा था। मेरे सिमुलेशन के लिए, हालांकि, मुझे एक महंगी फिटिंग प्रक्रिया के बिना अधिक विश्लेषणात्मक समाधान की आवश्यकता है। सौभाग्य से, मुझे अभी एक समाधान मिला है जिसे मैं शीघ्र ही पोस्ट करूंगा ...
फेलिक्स एस

यह बाइवेरिएट मानदंड बनाने के लिए काम करता है, लेकिन एक मनमाना वितरण (या किसी भी गैर-भ्रामक वितरण) के लिए काम नहीं करता है
मैक्रो

1
मैं यह नहीं देखता कि आप पुनरावृत्ति का प्रस्ताव क्यों देते हैं जब आप सीधे समाधान के पूरे शंकु का उत्पादन कर सकते हैं। क्या इस दृष्टिकोण का कोई विशेष उद्देश्य है?
whuber

1
अपना नवीनतम संपादन फिर से करें: चूंकि मैं सभी समाधानों के लिए एक सरल सूत्र प्रदान करता हूं , इसलिए कोई भी वांछित उद्देश्य प्राप्त कर सकता है जैसे "सभी समाधानों के सेट पर एक उपयुक्त उद्देश्य फ़ंक्शन को न्यूनतम करके" अधिक से अधिक समरूपता "। दृष्टिकोण पूरी तरह से सामान्य है। चर (या चर) को एक ऑर्थोगोनल आधार तक विस्तारित करके और सहसंबंध के पैमाने-व्युत्क्रम का शोषण करके, समस्या एक यूक्लिडियन स्पेस में एक क्षेत्र पर परिभाषित फ़ंक्शन को अनुकूलित करने में से एक बन जाती है। Y
whuber

1
@whuber, आपकी टिप्पणी वही है जिसका मुझे इंतजार था; वास्तव में मेरा जवाब (विषमलैंगिकता के बारे में, जिसे मैं लिंक करता हूं) आपके लिए एक चुनौती के रूप में था: शायद यह आपके समाधान को पोस्ट करने का निमंत्रण है - जैसा कि आप आमतौर पर करते हैं।
ttnphns

4

मुझे लगा कि मैं कुछ प्रोग्रामिंग कर रहा हूं, इसलिए मैंने @ आदम के डिलीट किए गए उत्तर को लिया और आर में एक अच्छा कार्यान्वयन लिखने का फैसला किया। मैं एक कार्यात्मक रूप से उन्मुख शैली (यानी लप्पी स्टाइल लूपिंग) का उपयोग करने पर ध्यान केंद्रित करता हूं। सामान्य विचार दो वैक्टर को लेना है, बेतरतीब ढंग से एक वैक्टर को तब तक परवान चढ़ाएं जब तक कि उनके बीच एक निश्चित सह-संबंध नहीं हो जाता। यह दृष्टिकोण बहुत ही क्रूर है, लेकिन इसे लागू करना सरल है।

पहले हम एक फ़ंक्शन बनाते हैं जो इनपुट वेक्टर को अनियमित रूप से अनुमति देता है:

randomly_permute = function(vec) vec[sample.int(length(vec))]
randomly_permute(1:100)
  [1]  71  34   8  98   3  86  28  37   5  47  88  35  43 100  68  58  67  82
 [19]  13   9  61  10  94  29  81  63  14  48  76   6  78  91  74  69  18  12
 [37]   1  97  49  66  44  40  65  59  31  54  90  36  41  93  24  11  77  85
 [55]  32  79  84  15  89  45  53  22  17  16  92  55  83  42  96  72  21  95
 [73]  33  20  87  60  38   7   4  52  27   2  80  99  26  70  50  75  57  19
 [91]  73  62  23  25  64  51  30  46  56  39

... और कुछ उदाहरण डेटा बनाएँ

vec1 = runif(100)
vec2 = runif(100)

... एक फ़ंक्शन लिखें जो इनपुट वेक्टर की अनुमति देता है, और इसे एक संदर्भ वेक्टर से संबद्ध करता है:

permute_and_correlate = function(vec, reference_vec) {
    perm_vec = randomly_permute(vec)
    cor_value = cor(perm_vec, reference_vec)
    return(list(vec = perm_vec, cor = cor_value))
  }
permute_and_correlate(vec2, vec1)
$vec
  [1] 0.79072381 0.23440845 0.35554970 0.95114398 0.77785348 0.74418811
  [7] 0.47871491 0.55981826 0.08801319 0.35698405 0.52140366 0.73996913
 [13] 0.67369873 0.85240338 0.57461506 0.14830718 0.40796732 0.67532970
 [19] 0.71901990 0.52031017 0.41357545 0.91780357 0.82437619 0.89799621
 [25] 0.07077250 0.12056045 0.46456652 0.21050067 0.30868672 0.55623242
 [31] 0.84776853 0.57217746 0.08626022 0.71740151 0.87959539 0.82931652
 [37] 0.93903143 0.74439384 0.25931398 0.99006038 0.08939812 0.69356590
 [43] 0.29254936 0.02674156 0.77182339 0.30047034 0.91790830 0.45862163
 [49] 0.27077191 0.74445997 0.34622648 0.58727094 0.92285322 0.83244284
 [55] 0.61397396 0.40616274 0.32203732 0.84003379 0.81109473 0.50573325
 [61] 0.86719899 0.45393971 0.19701975 0.63877904 0.11796154 0.26986325
 [67] 0.01581969 0.52571331 0.27087693 0.33821824 0.52590383 0.11261002
 [73] 0.89840404 0.82685046 0.83349287 0.46724807 0.15345334 0.60854785
 [79] 0.78854984 0.95770015 0.89193212 0.18885955 0.34303707 0.87332019
 [85] 0.08890968 0.22376395 0.02641979 0.43377516 0.58667068 0.22736077
 [91] 0.75948043 0.49734797 0.25235660 0.40125309 0.72147500 0.92423638
 [97] 0.27980561 0.71627101 0.07729027 0.05244047

$cor
[1] 0.1037542

... और एक हजार बार पुनरावृति:

n_iterations = lapply(1:1000, function(x) permute_and_correlate(vec2, vec1))

ध्यान दें कि R के स्कोपिंग नियम यह सुनिश्चित करते हैं vec1और vec2वैश्विक वातावरण में पाए जाते हैं, ऊपर उपयोग किए गए अनाम फ़ंक्शन के बाहर। इसलिए, हमारे द्वारा बनाए गए मूल परीक्षण डेटासेट के सापेक्ष सभी क्रमांकन हैं।

अगला, हम अधिकतम सहसंबंध पाते हैं:

cor_values = sapply(n_iterations, '[[', 'cor')
n_iterations[[which.max(cor_values)]]
$vec
  [1] 0.89799621 0.67532970 0.46456652 0.75948043 0.30868672 0.83244284
  [7] 0.86719899 0.55623242 0.63877904 0.73996913 0.71901990 0.85240338
 [13] 0.81109473 0.52571331 0.82931652 0.60854785 0.19701975 0.26986325
 [19] 0.58667068 0.52140366 0.40796732 0.22736077 0.74445997 0.40125309
 [25] 0.89193212 0.52031017 0.92285322 0.91790830 0.91780357 0.49734797
 [31] 0.07729027 0.11796154 0.69356590 0.95770015 0.74418811 0.43377516
 [37] 0.55981826 0.93903143 0.30047034 0.84776853 0.32203732 0.25235660
 [43] 0.79072381 0.58727094 0.99006038 0.01581969 0.41357545 0.52590383
 [49] 0.27980561 0.50573325 0.92423638 0.11261002 0.89840404 0.15345334
 [55] 0.61397396 0.27077191 0.12056045 0.45862163 0.18885955 0.77785348
 [61] 0.23440845 0.05244047 0.25931398 0.57217746 0.35554970 0.34622648
 [67] 0.21050067 0.08890968 0.84003379 0.95114398 0.83349287 0.82437619
 [73] 0.46724807 0.02641979 0.71740151 0.74439384 0.14830718 0.82685046
 [79] 0.33821824 0.71627101 0.77182339 0.72147500 0.08801319 0.08626022
 [85] 0.87332019 0.34303707 0.45393971 0.47871491 0.29254936 0.08939812
 [91] 0.35698405 0.67369873 0.27087693 0.78854984 0.87959539 0.22376395
 [97] 0.02674156 0.07077250 0.57461506 0.40616274

$cor
[1] 0.3166681

... या ०.२ के सहसंबंध के सबसे निकटतम मान ज्ञात करें:

n_iterations[[which.min(abs(cor_values - 0.2))]]
$vec
  [1] 0.02641979 0.49734797 0.32203732 0.95770015 0.82931652 0.52571331
  [7] 0.25931398 0.30047034 0.55981826 0.08801319 0.29254936 0.23440845
 [13] 0.12056045 0.89799621 0.57461506 0.99006038 0.27077191 0.08626022
 [19] 0.14830718 0.45393971 0.22376395 0.89840404 0.08890968 0.15345334
 [25] 0.87332019 0.92285322 0.50573325 0.40796732 0.91780357 0.57217746
 [31] 0.52590383 0.84003379 0.52031017 0.67532970 0.83244284 0.95114398
 [37] 0.81109473 0.35554970 0.92423638 0.83349287 0.34622648 0.18885955
 [43] 0.61397396 0.89193212 0.74445997 0.46724807 0.72147500 0.33821824
 [49] 0.71740151 0.75948043 0.52140366 0.69356590 0.41357545 0.21050067
 [55] 0.87959539 0.11796154 0.73996913 0.30868672 0.47871491 0.63877904
 [61] 0.22736077 0.40125309 0.02674156 0.26986325 0.43377516 0.07077250
 [67] 0.79072381 0.08939812 0.86719899 0.55623242 0.60854785 0.71627101
 [73] 0.40616274 0.35698405 0.67369873 0.82437619 0.27980561 0.77182339
 [79] 0.19701975 0.82685046 0.74418811 0.58667068 0.93903143 0.74439384
 [85] 0.46456652 0.85240338 0.34303707 0.45862163 0.91790830 0.84776853
 [91] 0.78854984 0.05244047 0.58727094 0.77785348 0.01581969 0.27087693
 [97] 0.07729027 0.71901990 0.25235660 0.11261002

$cor
[1] 0.2000199

उच्च सहसंबंध प्राप्त करने के लिए, आपको पुनरावृत्तियों की संख्या बढ़ाने की आवश्यकता है।


2

आइए एक अधिक सामान्य समस्या हल करें: चर को यादृच्छिक चर को सहसंबंध मैट्रिक्स कैसे उत्पन्न करें ?वाई 2 , , वाई एन आरY1Y2,,YnR

उपाय:

  1. सहसंबंध मैट्रिक्स के चोल्स्की अपघटन को प्राप्त करेंCCT=R
  2. स्वतंत्र यादृच्छिक वैक्टर के समान लंबाई कावाई 1X2,,XnY1
  3. पहले कॉलम के रूप में उपयोग करें और इससे उत्पन्न को जोड़ देंY1
  4. Y i Y Y=CX , जहां - आवश्यकता के अनुसार नए यादृच्छिक सहसंबंधित संख्याएँ, ध्यान दें, कि नहीं बदलेगाYiY1

पायथन कोड:

import numpy as np
import math
from scipy.linalg import toeplitz, cholesky
from statsmodels.stats.moment_helpers import cov2corr

# create the large correlation matrix R
p = 4
h = 2/p
v = np.linspace(1,-1+h,p)
R = cov2corr(toeplitz(v))

# create the first variable
T = 1000;
y = np.random.randn(T)

# generate p-1 correlated randoms
X = np.random.randn(T,p)
X[:,0] = y
C = cholesky(R)
Y = np.matmul(X,C)

# check that Y didn't change
print(np.max(np.abs(Y[:,0]-y)))

# check the correlation matrix
print(R)
print(np.corrcoef(np.transpose(Y)))

टेस्ट आउटपुट:

0.0
[[ 1.   0.5  0.  -0.5]
 [ 0.5  1.   0.5  0. ]
 [ 0.   0.5  1.   0.5]
 [-0.5  0.   0.5  1. ]]
[[ 1.          0.50261766  0.02553882 -0.46259665]
 [ 0.50261766  1.          0.51162821  0.05748082]
 [ 0.02553882  0.51162821  1.          0.51403266]
 [-0.46259665  0.05748082  0.51403266  1.        ]]

क्या आप स्पष्ट कर सकते हैं कि "नहीं है कि नहीं बदलेगा" का मतलब है? Y1
whuber

@ जब यह एक टाइपो था
अक्कल १२'१

0

दिए गए के रूप में सामांय सहसंयोजक मैट्रिक्स के साथ सामान्य चर उत्पन्न करें

covsam <- function(nobs,covm, seed=1237) {; 
          library (expm);
          # nons=number of observations, covm = given covariance matrix ; 
          nvar <- ncol(covm); 
          tot <- nvar*nobs;
          dat <- matrix(rnorm(tot), ncol=nvar); 
          covmat <- cov(dat); 
          a2 <- sqrtm(solve(covmat)); 
          m2 <- sqrtm(covm);
          dat2 <- dat %*% a2 %*% m2 ; 
          rc <- cov(dat2);};
          cm <- matrix(c(1,0.5,0.1,0.5,1,0.5,0.1,0.5,1),ncol=3);
          cm; 
          res <- covsam(10,cm)  ;
          res;

दी गई सहानुभूति मैट्रिक्स के साथ सामान्य चर उत्पन्न करें

covpop <- function(nobs,covm, seed=1237) {; 
          library (expm); 
          # nons=number of observations, covm = given covariance matrix;
          nvar <- ncol(covm); 
          tot <- nvar*nobs;  
          dat <- matrix(rnorm(tot), ncol=nvar); 
          m2 <- sqrtm(covm);
          dat2 <- dat %*% m2;  
          rc <- cov(dat2); }; 
          cm <- matrix(c(1,0.5,0.1,0.5,1,0.5,0.1,0.5,1),ncol=3);
          cm; 
          res <- covpop(10,cm); 
          res

2
आपको उत्तर में कोड को प्रारूपित करना सीखना होगा! कोड टुकड़े के रूप में पाठ को चिह्नित करने के लिए एक विशिष्ट विकल्प है, इसका उपयोग करें!
kjetil b halvorsen

-6

बस एक यादृच्छिक वेक्टर बनाएं और तब तक सॉर्ट करें जब तक आप वांछित आर प्राप्त न करें।


उपरोक्त स्थितियों में किन स्थितियों में यह बेहतर होगा?
एंडी डब्ल्यू

ऐसी स्थिति जहां एक उपयोगकर्ता एक सरल जवाब चाहता है। मैंने आर फोरम पर एक समान प्रश्न पढ़ा, और इसका उत्तर जो दिया गया था।
एडम

3
r

3
यदि यह उत्तर आर-हेल्प फ़ोरम पर दिया गया था, तो मुझे संदेह है कि यह या तो (ए) विडंबना है (यानी, एक मजाक के रूप में), या (ख) किसी ऐसे व्यक्ति द्वारा पेश किया गया जो बहुत सांख्यिकीय रूप से परिष्कृत नहीं है। इसे और अधिक स्पष्ट रूप से कहने के लिए, यह प्रश्न का एक खराब उत्तर है। -1
गुंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.