لغة R - فرز البيانات في نطاقات;حيث بلغ متوسطها;تجاهل القيم المتطرفة
سؤال
أنا تحليل البيانات من توربينات الرياح ، عادة هذا هو ما أود أن تفعل في 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)
نصائح أخرى
منذ كنت لم تعد في 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/
أنصح أيضا اللعب حولها مع هادلي الخاصة 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")