لغة R - فرز البيانات في نطاقات;حيث بلغ متوسطها;تجاهل القيم المتطرفة

StackOverflow https://stackoverflow.com/questions/4843194

  •  27-10-2019
  •  | 
  •  

سؤال

أنا تحليل البيانات من توربينات الرياح ، عادة هذا هو ما أود أن تفعل في excel ولكن كمية البيانات يتطلب شيئا الثقيلة.لم يسبق لي أن استخدمت R قبل ذلك أنا فقط أبحث عن بعض المؤشرات.

البيانات يتكون من الأعمدة 2 سرعة الرياح و السلطة, حتى وصل في استيراد البيانات من ملف CSV و مبعثر تآمر اثنين ضد بعضها البعض.

ما أود القيام به هو التالي لفرز البيانات في نطاقات;على سبيل المثال جميع البيانات حيث سرعة الرياح بين x و y ثم تجد متوسط الطاقة المولدة لكل نطاق الرسم البياني منحنى تشكيلها.

من هذا المتوسط أريد حساب المتوسط على أساس البيانات التي تندرج ضمن واحد من اثنين من انحرافات معيارية عن المتوسط (أساسا تجاهل القيم المتطرفة).

أي مؤشر يتم تقدير.

بالنسبة لأولئك الذين يرغبون أنا أحاول إنشاء الرسم البياني مماثلة هذا.انها جميلة القياسية نوع من الرسم البياني ولكن كما قلت القص كمية البيانات يتطلب شيئا أثقل من excel.

هل كانت مفيدة؟

المحلول

رمي هذا الإصدار مماثلة في الدافع كما @هادلي ، إلى المزيج باستخدام مضافة نموذج مع التكيف أكثر سلاسة باستخدام حزمة mgcv:

بيانات وهمية الأولى ، كما تستخدم من قبل @هادلي

w_sp <- sample(seq(0, 100, 0.01), 1000)
power <- 1/(1+exp(-(w_sp -40)/5)) + rnorm(1000, sd = 0.1)
df <- data.frame(power = power, w_sp = w_sp)

تناسب المضافة باستخدام نموذج gam(), باستخدام التكيف أكثر سلاسة ونعومة اختيار طريق REML

require(mgcv)
mod <- gam(power ~ s(w_sp, bs = "ad", k = 20), data = df, method = "REML")
summary(mod)

التنبؤ من نموذج لدينا والحصول على أخطاء قياسية تناسب استخدام الأخير لتوليد تقريبي 95% فاصل الثقة

x_grid <- with(df, data.frame(w_sp = seq(min(w_sp), max(w_sp), length = 100)))
pred <- predict(mod, x_grid, se.fit = TRUE)
x_grid <- within(x_grid, fit <- pred$fit)
x_grid <- within(x_grid, upr <- fit + 2 * pred$se.fit)
x_grid <- within(x_grid, lwr <- fit - 2 * pred$se.fit)

المؤامرة في كل شيء ، اللوس يصلح للمقارنة

plot(power ~ w_sp, data = df, col = "grey")
lines(fit ~ w_sp, data = x_grid, col = "red", lwd = 3)
## upper and lower confidence intervals ~95%
lines(upr ~ w_sp, data = x_grid, col = "red", lwd = 2, lty = "dashed")
lines(lwr ~ w_sp, data = x_grid, col = "red", lwd = 2, lty = "dashed")
## add loess fit from @hadley's answer
lines(x_grid$w_sp, predict(loess(power ~ w_sp, data = df), x_grid), col = "blue",
      lwd = 3)

adaptive smooth and loess fits

نصائح أخرى

منذ كنت لم تعد في Excel ، لماذا لا تستخدم الحديثة المنهجية الإحصائية التي لا تتطلب الخام binning البيانات المخصصة طرق إزالة القيم المتطرفة:محليا على نحو سلس الانحدار ، كما نفذت قبل اللوس.

باستخدام تعديل طفيف csgillespie عينة البيانات:

w_sp <- sample(seq(0, 100, 0.01), 1000)
power <- 1/(1+exp(-(w_sp -40)/5)) + rnorm(1000, sd = 0.1)

plot(w_sp, power)

x_grid <- seq(0, 100, length = 100)
lines(x_grid, predict(loess(power ~ w_sp), x_grid), col = "red", lwd = 3)

أولا نحن سوف خلق بعض البيانات المثال جعل المشكلة الخرسانة:

w_sp = sample(seq(0, 100, 0.01), 1000)
power = 1/(1+exp(-(rnorm(1000, mean=w_sp, sd=5) -40)/5))

لنفترض أننا نريد أن بن power القيم بين [0,5), [5,10) ، الخ.ثم

bin_incr = 5
bins = seq(0, 95, bin_incr)
y_mean = sapply(bins, function(x) mean(power[w_sp >= x & w_sp < (x+bin_incr)]))

لدينا الآن إنشاء تعني القيم التي تتراوح بين الفائدة.ملاحظة إذا أردت متوسط القيم مجرد تغيير mean إلى median.كل ما تبقى القيام به هو مؤامرة لهم:

plot(w_sp, power)
points(seq(2.5, 97.5, 5), y_mean, col=3, pch=16)

للحصول على متوسط استنادا إلى البيانات التي تقع في اثنين انحراف معياري من المتوسط ، نحن بحاجة إلى إنشاء أكثر تعقيدا قليلا الوظيفة:

noOutliers = function(x, power, w_sp, bin_incr) {
  d = power[w_sp >= x & w_sp < (x + bin_incr)]
  m_d = mean(d)
  d_trim = mean(d[d > (m_d - 2*sd(d)) & (d < m_d + 2*sd(d))])
  return(mean(d_trim))
}

y_no_outliers = sapply(bins, noOutliers, power, w_sp, bin_incr)

وهنا بعض الأمثلة من تركيبها منحنيات (weibull تحليل) التجارية توربينات:

http://www.inl.gov/wind/software/

http://www.irec.cmerp.net/papers/WOE/Paper%20ID%20161.pdf

http://www.icaen.uiowa.edu/~ie_155/محاضرة/Power_Curve.pdf

أنصح أيضا اللعب حولها مع هادلي الخاصة ggplot2.الإنترنت هو كبير من الموارد: http://had.co.nz/ggplot2/ .

    # If you haven't already installed ggplot2:
    install.pacakges("ggplot2", dependencies = T)

    # Load the ggplot2 package
    require(ggplot2)

    # csgillespie's example data
    w_sp <- sample(seq(0, 100, 0.01), 1000)
    power <- 1/(1+exp(-(w_sp -40)/5)) + rnorm(1000, sd = 0.1)

    # Bind the two variables into a data frame, which ggplot prefers
    wind <- data.frame(w_sp = w_sp, power = power)

    # Take a look at how the first few rows look, just for fun
    head(wind)


    # Create a simple plot
    ggplot(data = wind, aes(x = w_sp, y = power)) + geom_point() + geom_smooth()

    # Create a slightly more complicated plot as an example of how to fine tune
    # plots in ggplot
    p1 <- ggplot(data = wind, aes(x = w_sp, y = power))
    p2 <- p1 + geom_point(colour = "darkblue", size = 1, shape = "dot") 
    p3 <- p2 + geom_smooth(method = "loess", se = TRUE, colour = "purple")
    p3 + scale_x_continuous(name = "mph") + 
             scale_y_continuous(name = "power") +
             opts(title = "Wind speed and power")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top