เมื่อข้อมูลมีการแจกแจงแบบเกาส์ตัวอย่างจะมีลักษณะเป็นจำนวนเท่าใด


12

ข้อมูลแบบเกาส์กระจายในมิติเดียวต้องใช้พารามิเตอร์สองตัวในการอธิบายลักษณะ (ค่าเฉลี่ยความแปรปรวน) และข่าวลือมีว่าตัวอย่างที่เลือกแบบสุ่มประมาณ 30 ตัวอย่างเพียงพอที่จะประมาณค่าพารามิเตอร์เหล่านี้ แต่จะเกิดอะไรขึ้นเมื่อจำนวนมิติเพิ่มขึ้น

ในสองมิติ (เช่นความสูงน้ำหนัก) ใช้เวลา 5 พารามิเตอร์ในการระบุวงรี "ที่ดีที่สุด" ในสามมิตินี้เพิ่มขึ้นเป็น 9 พารามิเตอร์เพื่ออธิบายรูปวงรีและใน 4 มิติใช้เวลา 14 พารามิเตอร์ ฉันสนใจที่จะทราบว่าจำนวนตัวอย่างที่จำเป็นในการประมาณค่าพารามิเตอร์เหล่านี้ยังเพิ่มขึ้นในอัตราที่เทียบเคียงในอัตราที่ช้ากว่าหรือ (โปรดอย่า!) ในอัตราที่สูงขึ้น ยังดีกว่าถ้ามีกฎของหัวแม่มือยอมรับในวงกว้างที่แนะนำจำนวนตัวอย่างที่จำเป็นในการจำแนกลักษณะการแจกแจงแบบเกาส์ในจำนวนมิติที่กำหนดนั่นจะเป็นการดีที่จะรู้

หากต้องการแม่นยำยิ่งขึ้นสมมติว่าเราต้องการกำหนดขอบเขต "แบบที่เหมาะสมที่สุด" แบบสมมาตรซึ่งมีศูนย์กลางอยู่ที่จุดเฉลี่ยภายในซึ่งเรามั่นใจได้ว่า 95% ของตัวอย่างทั้งหมดจะลดลง ฉันต้องการทราบจำนวนตัวอย่างที่ใช้ในการค้นหาพารามิเตอร์เพื่อประมาณขอบเขตนี้ (ช่วงเวลาใน 1-D, วงรีใน 2-D, ฯลฯ ) ด้วยความมั่นใจสูง (> 95%) และความแตกต่างของจำนวนนั้น จำนวนมิติเพิ่มขึ้น


3
หากไม่มีคำจำกัดความที่แม่นยำเพียงพอของ 'ตรึงลง' มันเป็นไปไม่ได้จริงๆที่จะตอบคำถามนี้แม้จะเป็นแบบเกาส์ที่ไม่แปรเปลี่ยนก็ตาม
Glen_b -Reinstate Monica

1
วิธีการ: มีตัวอย่างจำนวนเท่าใดที่มั่นใจอย่างน้อย 95% ที่ 95% ของตัวอย่างทั้งหมด (แต่มีเพียง 95% ของตัวอย่างทั้งหมด) จะอยู่ในช่วงเวลาที่กำหนด / ellipse / ellipsoid / hyperellipsoid
omatai

1
กล่าวคือ ... 95% ของตัวอย่างทั้งหมดจะอยู่ในระยะที่กำหนดไว้โดยเฉลี่ย ต้องมีตัวอย่างจำนวนเท่าใดในการกำหนดระยะทาง (ช่วงเวลา / วงรี / วงรี / ฯลฯ ) ด้วยความมั่นใจ 95% หรือดีกว่า
omatai

1
ทันทีที่คุณมีค่าหนึ่งเป็นอิสระมากขึ้นกว่าข้อมูลที่มีพารามิเตอร์ (มาจากไหนค่าในมิติ) คุณสามารถยกภูมิภาคความเชื่อมั่น 95% รอบตัวพวกเขา (หนึ่งสามารถทำได้ดียิ่งขึ้นโดยใช้เทคนิคที่ไม่ใช่แบบดั้งเดิม ) นั่นคือคำตอบ - มันเป็นหนึ่งที่ชัดเจน - แต่อาจไม่ใช่สิ่งที่คุณกำลังมองหา ประเด็นก็คือคุณต้องกำหนดระดับความถูกต้องที่แน่นอนเพื่อให้ได้คำตอบสำหรับคำถามนี้ (d+22)d
whuber

1
Snedecor & Cochran [ วิธีการทางสถิติรุ่นที่ 8] เป็นหน่วยงานในการสุ่มตัวอย่าง พวกเขาอธิบายกระบวนการนี้ในบทที่ 4 และ 6: "เราคิดในตอนแรกว่าส่วนเบี่ยงเบนมาตรฐานของประชากร ... เป็นที่รู้จักกัน" ต่อมาพวกเขาเขียนว่า "วิธีการนี้มีประโยชน์มากที่สุดในช่วงแรก ๆ ของงาน ... ตัวอย่างเช่นการทดลองขนาดเล็กก่อนหน้านี้ได้ระบุว่าการรักษาใหม่ให้เพิ่มขึ้นประมาณ 20% และอยู่ที่ประมาณ 7% . ผู้ตรวจสอบ ... [ต้องการ] SE ของ 2% แล้วจึงตั้ง , ให้ ... สิ่งนี้ ... มักเป็นประโยชน์ ในการทำงานในภายหลัง σ ± σDσ±n=252(7)/n=2n=25
whuber

คำตอบ:


7

จำนวนข้อมูลที่ต้องใช้ในการประมาณค่าพารามิเตอร์ของการแจกแจงหลายตัวแปรปกติภายในความถูกต้องที่ระบุไว้กับความเชื่อมั่นที่กำหนดไม่แตกต่างกันไปตามมิติสิ่งอื่น ๆ ทั้งหมดก็เหมือนกัน ดังนั้นคุณอาจใช้กฎง่ายๆสำหรับสองมิติกับปัญหามิติที่สูงขึ้นโดยไม่มีการเปลี่ยนแปลงเลย

ทำไมจึงเป็นเช่นนั้น? มีพารามิเตอร์สามชนิดเท่านั้น: หมายถึงความแปรปรวนและความแปรปรวนร่วม n ดังนั้นเมื่อมีการแจกแจงปกติหลายตัวแปรและมีความแปรปรวนดังนั้นการประมาณของและขึ้นอยู่กับและเท่านั้น ดังนั้นเพื่อให้เกิดความถูกต้องเพียงพอในการประมาณทั้งหมด , เราจะต้องพิจารณาจำนวนของข้อมูลที่จำเป็นสำหรับการมีที่ใหญ่ที่สุดของ( X 1 , X 2 , , X d ) X i σ 2 i E [ X i ] σ i n E [ X i ] X i σ i d σ in(X1,X2,,Xd)Xiσi2E[Xi]σinE[Xi]Xiσi. ดังนั้นเมื่อเราพิจารณาการต่อเนื่องของปัญหาการประมาณค่าสำหรับการเพิ่มมิติสิ่งที่เราต้องพิจารณาคือใหญ่ที่สุดจะเพิ่มขึ้นเมื่อพารามิเตอร์เหล่านี้มีขอบเขตด้านบนเราสรุปได้ว่าปริมาณข้อมูลที่ต้องการไม่ขึ้นอยู่กับขนาดdσi

ข้อพิจารณาที่คล้ายกันนำไปใช้กับการประมาณค่าความแปรปรวนและ covariances : ถ้าจำนวนข้อมูลเพียงพอสำหรับการประมาณหนึ่งความแปรปรวนร่วม (หรือสัมประสิทธิ์สหสัมพันธ์) กับความถูกต้องที่ต้องการ ค่าพารามิเตอร์ - จำนวนเดียวกันของข้อมูลที่จะพอเพียงสำหรับการประเมินใด ๆแปรปรวนหรือค่าสัมประสิทธิ์สหสัมพันธ์ σ ฉันเจσi2σij


เพื่อแสดงและให้การสนับสนุนเชิงประจักษ์สำหรับการโต้แย้งนี้มาศึกษาแบบจำลองบางอย่าง ต่อไปนี้สร้างพารามิเตอร์สำหรับการแจกแจงแบบพหุคูณของมิติข้อมูลที่ระบุดึงชุดเวกเตอร์ที่กระจายแบบอิสระจำนวนมากจากการแจกแจงนั้นประมาณค่าพารามิเตอร์จากตัวอย่างแต่ละตัวอย่างและสรุปผลลัพธ์ของการประมาณพารามิเตอร์เหล่านั้นในแง่ของ (1) ค่าเฉลี่ย - - เพื่อแสดงให้เห็นว่าพวกเขาไม่มีอคติ (และรหัสทำงานอย่างถูกต้อง - และ (2) ส่วนเบี่ยงเบนมาตรฐานของพวกเขาซึ่งวัดปริมาณความถูกต้องของการประมาณการ (อย่าสับสนระหว่างค่าเบี่ยงเบนมาตรฐานเหล่านี้ การวนซ้ำของการจำลองโดยใช้ค่าเบี่ยงเบนมาตรฐานเพื่อกำหนดการแจกแจงพหุคูณพื้นฐาน!ddการเปลี่ยนแปลงโดยมีเงื่อนไขว่าการเปลี่ยนแปลงเราไม่แนะนำความแปรปรวนขนาดใหญ่ในการแจกแจงพหุคูณพื้นฐานd

ขนาดของผลต่างของการกระจายต้นแบบจะถูกควบคุมในการจำลองนี้โดยการทำให้ค่าเฉพาะที่ใหญ่ที่สุดของความแปรปรวนเมทริกซ์เท่ากับ1สิ่งนี้จะช่วยรักษาความหนาแน่นของความน่าจะเป็น "เมฆ" ภายในขอบเขตเมื่อมิติเพิ่มขึ้นไม่ว่ารูปร่างของคลาวด์นี้จะเป็นอย่างไร การจำลองพฤติกรรมของระบบในแบบจำลองอื่น ๆ เมื่อขนาดเพิ่มขึ้นสามารถสร้างขึ้นได้ง่ายๆโดยการเปลี่ยนวิธีการสร้างค่าลักษณะเฉพาะ ตัวอย่างหนึ่ง (โดยใช้การแจกแจงแกมมา) จะแสดงความคิดเห็นในรหัสด้านล่าง1R

สิ่งที่เรากำลังมองหาคือการตรวจสอบว่าค่าเบี่ยงเบนมาตรฐานของการประมาณการพารามิเตอร์ไม่เปลี่ยนแปลงเมื่อประเมินมิติมีการเปลี่ยนแปลง ดังนั้นผมจึงแสดงผลสำหรับสองขั้ว,และ , ใช้จำนวนเงินเดียวกันของข้อมูล ( ) ในทั้งสองกรณี เป็นที่น่าสังเกตว่าจำนวนของพารามิเตอร์ที่ประเมินเมื่อเท่ากับนั้นสูงกว่าจำนวนของเวกเตอร์ ( ) และสูงกว่าแม้แต่ตัวเลขแต่ละตัว ( ) ในชุดข้อมูลทั้งหมดd = 2 d = 60 30 d = 60 1890 30 30 60 = 1800dd=2d=6030d=601890303060=1800

ขอเริ่มต้นด้วยสองมิติ, 2 มีห้าพารามิเตอร์: สองตัวแปร (พร้อมค่าเบี่ยงเบนมาตรฐานและในการจำลองนี้), ความแปรปรวนร่วม (SD = ) และสองวิธี (SD =และ ) ด้วยการจำลองสถานการณ์ที่แตกต่างกัน (หาได้โดยการเปลี่ยนค่าเริ่มต้นของเมล็ดสุ่ม) เหล่านี้จะแตกต่างกันเล็กน้อย แต่พวกเขาอย่างสม่ำเสมอจะมีขนาดใกล้เคียงเมื่อขนาดตัวอย่างnตัวอย่างเช่นในการจำลองครั้งถัดไป SDs มีค่า , , ,และ0.097 0.182 0.126 0.11 0.15 n = 30 0.014 0.263 0.043 0.04 0.18d=20.0970.1820.1260.110.15n=300.0140.2630.0430.040.18ตามลำดับ: พวกเขาเปลี่ยนไปทั้งหมด แต่มีขนาดใกล้เคียงกัน

(ข้อความเหล่านี้สามารถได้รับการสนับสนุนทางทฤษฎี แต่ประเด็นที่นี่คือเพื่อให้การสาธิตเชิงประจักษ์อย่างหมดจด)

ตอนนี้เราย้ายไป , การรักษาขนาดของกลุ่มตัวอย่างที่ nโดยเฉพาะนี่หมายความว่าแต่ละตัวอย่างประกอบด้วยเวกเตอร์แต่ละอันมีส่วนประกอบตัว แทนที่จะแสดงค่าเบี่ยงเบนมาตรฐานทั้งหมดลองดูรูปของพวกมันโดยใช้ฮิสโตแกรมเพื่อแสดงช่วงของพวกมันn = 30 30 60 1890d=60n=3030601890

รูป

Scatterplots ในแถวบนสุดเปรียบเทียบพารามิเตอร์จริงsigma( ) และ( ) กับค่าเฉลี่ยโดยประมาณในระหว่างการทำซ้ำในการจำลองนี้ เส้นอ้างอิงสีเทาทำเครื่องหมายตำแหน่งของความเท่าเทียมกันที่สมบูรณ์แบบ: การประมาณกำลังทำงานอย่างชัดเจนและเป็นกลางμ 10 4σmuμ104

ฮิสโทแกรมปรากฏในแถวด้านล่างแยกต่างหากสำหรับรายการทั้งหมดในเมทริกซ์ความแปรปรวนร่วม (ซ้าย) และสำหรับวิธี (ขวา) เอกสารความปลอดภัยของบุคคลที่แปรปรวนมีแนวโน้มที่จะอยู่ระหว่างและในขณะที่ SDS ของcovariancesระหว่างแยกส่วนประกอบมีแนวโน้มที่จะอยู่ระหว่างและ : ว่าในช่วงที่ประสบความสำเร็จเมื่อ 2 ในทำนองเดียวกัน SDS ของประมาณการเฉลี่ยมีแนวโน้มที่จะอยู่ระหว่างและซึ่งเทียบได้กับสิ่งที่ถูกมองเมื่อ 2 แน่นอนไม่มีข้อบ่งชี้ว่า SDs เพิ่มขึ้นเป็น0.12 0.04 0.08 d = 2 0.08 0.13 d = 2 d 2 600.080.120.040.08d=20.080.13d=2dขึ้นไปจากที่จะ60260

รหัสดังต่อไปนี้

#
# Create iid multivariate data and do it `n.iter` times.
#
sim <- function(n.data, mu, sigma, n.iter=1) {
  #
  # Returns arrays of parmeter estimates (distinguished by the last index).
  #
  library(MASS) #mvrnorm()
  x <- mvrnorm(n.iter * n.data, mu, sigma)
  s <- array(sapply(1:n.iter, function(i) cov(x[(n.data*(i-1)+1):(n.data*i),])), 
        dim=c(n.dim, n.dim, n.iter))
  m <-array(sapply(1:n.iter, function(i) colMeans(x[(n.data*(i-1)+1):(n.data*i),])), 
            dim=c(n.dim, n.iter))
  return(list(m=m, s=s))
}
#
# Control the study.
#
set.seed(17)
n.dim <- 60
n.data <- 30    # Amount of data per iteration
n.iter <- 10^4  # Number of iterations
#n.parms <- choose(n.dim+2, 2) - 1
#
# Create a random mean vector.
#
mu <- rnorm(n.dim)
#
# Create a random covariance matrix.
#
#eigenvalues <- rgamma(n.dim, 1)
eigenvalues <- exp(-seq(from=0, to=3, length.out=n.dim)) # For comparability
u <- svd(matrix(rnorm(n.dim^2), n.dim))$u
sigma <- u %*% diag(eigenvalues) %*% t(u)
#
# Perform the simulation.
# (Timing is about 5 seconds for n.dim=60, n.data=30, and n.iter=10000.)
#
system.time(sim.data <- sim(n.data, mu, sigma, n.iter))
#
# Optional: plot the simulation results.
#
if (n.dim <= 6) {
  par(mfcol=c(n.dim, n.dim+1))
  tmp <- apply(sim.data$s, 1:2, hist)
  tmp <- apply(sim.data$m, 1, hist)
}
#
# Compare the mean simulation results to the parameters.
#
par(mfrow=c(2,2))
plot(sigma, apply(sim.data$s, 1:2, mean), main="Average covariances")
abline(c(0,1), col="Gray")
plot(mu, apply(sim.data$m, 1, mean), main="Average means")
abline(c(0,1), col="Gray")
#
# Quantify the variability.
#
i <- lower.tri(matrix(1, n.dim, n.dim), diag=TRUE)
hist(sd.cov <- apply(sim.data$s, 1:2, sd)[i], main="SD covariances")
hist(sd.mean <- apply(sim.data$m, 1, sd), main="SD means")
#
# Display the simulation standard deviations for inspection.
#
sd.cov
sd.mean

1

ตัวเลขสั้น ๆ บางค่าให้การแจกแจงข้อผิดพลาดต่อไปนี้สำหรับตัวอย่าง 30 ตัวอย่างที่สร้างขึ้นจากการแจกแจงแบบปกติมาตรฐาน

ป้อนคำอธิบายรูปภาพที่นี่

ควอไทล์จะถูกระบุ สันนิษฐานว่าต้องการการเปลี่ยนแปลงในระดับนี้ในกรณีที่มีหลายมิติ

ฉันไม่มีเวลาที่จะเอาชนะ MatLab เพื่อให้ได้ผลลัพธ์ทั้งหมดดังนั้นฉันจะแบ่งปัน "กฎง่ายๆ" ของฉัน 30 ถูกจัดให้เป็นกฎของหัวแม่มือหรือฮิวริสติกดังนั้นจึงสันนิษฐานว่าฮิวริสติกไม่เป็นที่ยอมรับ

ฮิวริสติกของฉันคือใช้สามเหลี่ยมของปาสคาลคูณด้วยกรณีที่ไม่แปร ป้อนคำอธิบายรูปภาพที่นี่

ถ้าฉันใช้ข้อมูล 2d จากนั้นฉันไปที่แถวที่ 2 แล้วหาผลรวมเพื่อรับ 2x จำนวนตัวอย่างหรือ 60 ตัวอย่าง สำหรับข้อมูล 3 มิติฉันไปที่แถวที่ 3 แล้วหาผลรวมเพื่อให้ได้จำนวนตัวอย่าง 4 เท่าหรือ 120 ตัวอย่าง สำหรับข้อมูล 5d ฉันไปที่แถวที่ 5 แล้วหาผลรวมเพื่อให้ได้ 16x จำนวนตัวอย่างหรือ 480 ตัวอย่าง

ขอให้โชคดี

แก้ไข:

มันง่าย แต่ทุกอย่างจะต้องได้รับการปกป้องในวิชาคณิตศาสตร์ ฉันไม่สามารถก้าวกระโดดจากการกำหนดรูปแบบพหุนามจาก Finite Elements ที่มีประสบการณ์มาเพื่อสร้างสนามเบสบอล

สมการของผลรวมของแถวของสามเหลี่ยมปาสคาลเป็น k 2 kkth2k

ความคิดของฉันสำหรับวิธีการที่นี่คือการเปรียบเทียบ AIC ของการกระจายมิติที่สูงขึ้นด้วยตัวอย่างที่มากขึ้นเพื่อลดการกระจายมิติที่มีตัวอย่างน้อยลง

เกณฑ์ข้อมูล Akaike (AIC) ถูกกำหนดเป็นโดยที่เป็นผลรวมที่เหลือของสแควร์สคือจำนวนตัวอย่างและคือจำนวนพารามิเตอร์สำหรับแบบจำลอง . RSSnkAIC=nlog(RSSn)+2kRSSnk

AIC1=AIC2

n1log(RSS1n1)+2k1=n2log(RSS2n2)+2k2

สำหรับแต่ละมิติที่เรากำจัดนี่หมายความว่าค่าเฉลี่ยสูญเสียแถวและค่าความแปรปรวนร่วมสูญเสียทั้งแถวและคอลัมน์ เราสามารถระบุสิ่งนี้เป็น

k(d)=d2+d D

ของ

k(d+1)k(d)=2d+2

สมมติว่าข้อผิดพลาดต่อจุดตัวอย่างเป็นค่าคงที่เกี่ยวข้องกับผลรวมที่เหลือของกำลังสองกับจำนวนตัวอย่างและคำในลอการิทึมคงที่ ความแตกต่างในการนับตัวอย่างจะกลายเป็นค่าคงที่การปรับสเกล

ดังนั้นเราจึงมี:

n1A+2(k2+2d+2)=n2A+2k2

การแก้เพื่อเพิ่มตัวอย่างที่มีมิติจะช่วยให้:

n2n1=(2(k2+2d+2)2k2)A1=(4d+4)A1

ฟังก์ชันการปรับสเกลคืออะไร สมมติว่าสำหรับ Gaussian 2 มิติหลายตัวแปรจำนวนตัวอย่างที่ต้องการคือ 15 ต่อพารามิเตอร์ มีค่าเฉลี่ย 2 และ 4 องค์ประกอบของความแปรปรวนร่วมดังนั้น 6 พารามิเตอร์หรือ 90 ตัวอย่าง ความแตกต่างคือ 60 ตัวอย่างค่าของ5 A1=5

ป้อนคำอธิบายรูปภาพที่นี่

ณ จุดนี้ฉันจะบอกว่าฮิวริสติกเริ่มน้อยลง แต่จบลงด้วยการเป็น 2x เท่าจำนวนตัวอย่างที่ต้องการ ช่วงของยูทิลิตี้ที่ดีที่สุดในความเห็นส่วนตัวของฉันอยู่ที่ประมาณ 4 มิติหรือมากกว่านั้น

แก้ไข:

ดังนั้นฉันได้อ่านคำตอบของ @whuber และฉันชอบมัน มันเป็นเชิงประจักษ์และในกรณีนี้ที่มีสิทธิ์ ฉันโหวตให้กับคำตอบของเขา

ในตอนต่อไปนี้ฉันพยายามพูดคุยและหวังว่าจะสามารถใช้อักขระได้มากกว่า 300 ตัวและฉันหวังว่าจะสามารถฝังรูปภาพได้ ฉันกำลังคุยกันภายในขอบเขตของคำตอบ ฉันหวังว่ามันจะโอเค

ฉันมาถึงจุดนี้ไม่เชื่อว่าการใช้ AIC สำหรับเรื่องนี้หรือวิธีการใช้ขนาดตัวอย่างและขนาดพารามิเตอร์ไม่ถูกต้อง

ขั้นตอนถัดไป:

  • ทำซ้ำผลลัพธ์ของ @ whuber ยืนยันยืนยัน
  • ทดสอบ AIC อย่างน้อยก็ในบางแง่มุมเพื่อยืนยันว่ามันเหมาะสมหรือไม่
  • หาก AIC เหมาะสมแล้วให้ลองใช้วิธีเชิงประจักษ์เพื่อไล่ข้อบกพร่องในการให้เหตุผล

ความคิดเห็นและข้อเสนอแนะยินดีต้อนรับ


4
คุณช่วยให้เหตุผลบางอย่างสำหรับการแก้ปัญหาของคุณ?
whuber

1
และคุณสามารถยืนยันได้ว่าผลรวมของแถวที่ 5 นั้นเป็นจริง 16 หรือไม่
omatai

1 + 4 + 6 + 4 + 1 = 1 + 10 + 5 = 16. ขออภัยเกี่ยวกับเรื่องนั้น 16 22. ฉันต้องนอนหลับครึ่งเมื่อฉันเพิ่ม
EngrStudent

1
คุณคิดอย่างไรกับสำหรับจำนวนพารามิเตอร์? มีมากเกินไป ตัวอย่างเช่นด้วยองค์ประกอบเพียงพารามิเตอร์ที่จำเป็น (สำหรับหมายถึง,ค่าแปรปรวนร่วมและความสัมพันธ์ค่า) สิ่งนี้สามารถอธิบายได้ว่าทำไมคำแนะนำของคุณถึงมีขนาดตัวอย่างที่สูงเป็นพิเศษ! d = 92d+12d=99 9 36549936
whuber

1
@whuber ฉันพบว่าฉันเรียนรู้เพิ่มเติมจากข้อผิดพลาดของฉัน (หลังจากฉันเรียนรู้จากพวกเขา) มากกว่าที่ฉันถูกต้อง น่าแปลกที่พอผิดความรู้สึกเหมือนถูกจนกว่าฉันจะรู้ว่าฉันผิด ขอบคุณ. ted.com/talks/kathryn_schulz_on_being_wrong.html
EngrStudent
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.